@cratis/components 4.23.0 → 4.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compat-manifest.json +11 -11
- package/dist/esm/IconPicker/IconPicker.d.ts +57 -0
- package/dist/esm/IconPicker/IconPicker.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPicker.js +59 -0
- package/dist/esm/IconPicker/IconPicker.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerAllowed.d.ts +8 -0
- package/dist/esm/IconPicker/IconPickerAllowed.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerAllowed.js +4 -0
- package/dist/esm/IconPicker/IconPickerAllowed.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerBrowser.d.ts +32 -0
- package/dist/esm/IconPicker/IconPickerBrowser.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerBrowser.js +4 -0
- package/dist/esm/IconPicker/IconPickerBrowser.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerBrowserGroup.d.ts +9 -0
- package/dist/esm/IconPicker/IconPickerBrowserGroup.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerBrowserGroup.js +4 -0
- package/dist/esm/IconPicker/IconPickerBrowserGroup.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerCatalog.d.ts +19 -0
- package/dist/esm/IconPicker/IconPickerCatalog.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerCatalog.js +4 -0
- package/dist/esm/IconPicker/IconPickerCatalog.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerCatalogStatus.d.ts +3 -0
- package/dist/esm/IconPicker/IconPickerCatalogStatus.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerCatalogStatus.js +4 -0
- package/dist/esm/IconPicker/IconPickerCatalogStatus.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerCategoryFilter.d.ts +25 -0
- package/dist/esm/IconPicker/IconPickerCategoryFilter.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerCategoryFilter.js +23 -0
- package/dist/esm/IconPicker/IconPickerCategoryFilter.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerEntry.d.ts +25 -0
- package/dist/esm/IconPicker/IconPickerEntry.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerEntry.js +4 -0
- package/dist/esm/IconPicker/IconPickerEntry.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerGrid.d.ts +29 -0
- package/dist/esm/IconPicker/IconPickerGrid.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerGrid.js +24 -0
- package/dist/esm/IconPicker/IconPickerGrid.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerIndexEntry.d.ts +11 -0
- package/dist/esm/IconPicker/IconPickerIndexEntry.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerIndexEntry.js +4 -0
- package/dist/esm/IconPicker/IconPickerIndexEntry.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerLabels.d.ts +76 -0
- package/dist/esm/IconPicker/IconPickerLabels.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerLabels.js +4 -0
- package/dist/esm/IconPicker/IconPickerLabels.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerLibrary.d.ts +12 -0
- package/dist/esm/IconPicker/IconPickerLibrary.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerLibrary.js +4 -0
- package/dist/esm/IconPicker/IconPickerLibrary.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerLibraryFilter.d.ts +20 -0
- package/dist/esm/IconPicker/IconPickerLibraryFilter.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerLibraryFilter.js +7 -0
- package/dist/esm/IconPicker/IconPickerLibraryFilter.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerParts.d.ts +65 -0
- package/dist/esm/IconPicker/IconPickerParts.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerParts.js +4 -0
- package/dist/esm/IconPicker/IconPickerParts.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerPlacement.d.ts +3 -0
- package/dist/esm/IconPicker/IconPickerPlacement.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerPlacement.js +4 -0
- package/dist/esm/IconPicker/IconPickerPlacement.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerPopout.d.ts +32 -0
- package/dist/esm/IconPicker/IconPickerPopout.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerPopout.js +41 -0
- package/dist/esm/IconPicker/IconPickerPopout.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerResults.d.ts +31 -0
- package/dist/esm/IconPicker/IconPickerResults.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerResults.js +21 -0
- package/dist/esm/IconPicker/IconPickerResults.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerSearch.d.ts +21 -0
- package/dist/esm/IconPicker/IconPickerSearch.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerSearch.js +21 -0
- package/dist/esm/IconPicker/IconPickerSearch.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerSummary.d.ts +12 -0
- package/dist/esm/IconPicker/IconPickerSummary.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerSummary.js +4 -0
- package/dist/esm/IconPicker/IconPickerSummary.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerTile.d.ts +36 -0
- package/dist/esm/IconPicker/IconPickerTile.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerTile.js +22 -0
- package/dist/esm/IconPicker/IconPickerTile.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerTrigger.d.ts +39 -0
- package/dist/esm/IconPicker/IconPickerTrigger.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerTrigger.js +13 -0
- package/dist/esm/IconPicker/IconPickerTrigger.js.map +1 -0
- package/dist/esm/IconPicker/IconPickerValue.d.ts +16 -0
- package/dist/esm/IconPicker/IconPickerValue.d.ts.map +1 -0
- package/dist/esm/IconPicker/IconPickerValue.js +4 -0
- package/dist/esm/IconPicker/IconPickerValue.js.map +1 -0
- package/dist/esm/IconPicker/createIconPickerIndex.d.ts +10 -0
- package/dist/esm/IconPicker/createIconPickerIndex.d.ts.map +1 -0
- package/dist/esm/IconPicker/createIconPickerIndex.js +21 -0
- package/dist/esm/IconPicker/createIconPickerIndex.js.map +1 -0
- package/dist/esm/IconPicker/defaultIconPickerLabels.d.ts +4 -0
- package/dist/esm/IconPicker/defaultIconPickerLabels.d.ts.map +1 -0
- package/dist/esm/IconPicker/defaultIconPickerLabels.js +35 -0
- package/dist/esm/IconPicker/defaultIconPickerLabels.js.map +1 -0
- package/dist/esm/IconPicker/formatIconPickerIdentity.d.ts +8 -0
- package/dist/esm/IconPicker/formatIconPickerIdentity.d.ts.map +1 -0
- package/dist/esm/IconPicker/formatIconPickerIdentity.js +4 -0
- package/dist/esm/IconPicker/formatIconPickerIdentity.js.map +1 -0
- package/dist/esm/IconPicker/groupIconPickerByCategory.d.ts +10 -0
- package/dist/esm/IconPicker/groupIconPickerByCategory.d.ts.map +1 -0
- package/dist/esm/IconPicker/groupIconPickerByCategory.js +17 -0
- package/dist/esm/IconPicker/groupIconPickerByCategory.js.map +1 -0
- package/dist/esm/IconPicker/iconPickerIdentity.d.ts +8 -0
- package/dist/esm/IconPicker/iconPickerIdentity.d.ts.map +1 -0
- package/dist/esm/IconPicker/iconPickerIdentity.js +4 -0
- package/dist/esm/IconPicker/iconPickerIdentity.js.map +1 -0
- package/dist/esm/IconPicker/index.d.ts +19 -0
- package/dist/esm/IconPicker/index.d.ts.map +1 -0
- package/dist/esm/IconPicker/index.js +8 -0
- package/dist/esm/IconPicker/index.js.map +1 -0
- package/dist/esm/IconPicker/isIconPickerAllowed.d.ts +10 -0
- package/dist/esm/IconPicker/isIconPickerAllowed.d.ts.map +1 -0
- package/dist/esm/IconPicker/isIconPickerAllowed.js +12 -0
- package/dist/esm/IconPicker/isIconPickerAllowed.js.map +1 -0
- package/dist/esm/IconPicker/isSameIconPickerValue.d.ts +10 -0
- package/dist/esm/IconPicker/isSameIconPickerValue.d.ts.map +1 -0
- package/dist/esm/IconPicker/isSameIconPickerValue.js +4 -0
- package/dist/esm/IconPicker/isSameIconPickerValue.js.map +1 -0
- package/dist/esm/IconPicker/searchIconPickerIndex.d.ts +9 -0
- package/dist/esm/IconPicker/searchIconPickerIndex.d.ts.map +1 -0
- package/dist/esm/IconPicker/searchIconPickerIndex.js +9 -0
- package/dist/esm/IconPicker/searchIconPickerIndex.js.map +1 -0
- package/dist/esm/IconPicker/toIconPickerValue.d.ts +9 -0
- package/dist/esm/IconPicker/toIconPickerValue.d.ts.map +1 -0
- package/dist/esm/IconPicker/toIconPickerValue.js +6 -0
- package/dist/esm/IconPicker/toIconPickerValue.js.map +1 -0
- package/dist/esm/IconPicker/useGridColumns.d.ts +12 -0
- package/dist/esm/IconPicker/useGridColumns.d.ts.map +1 -0
- package/dist/esm/IconPicker/useGridColumns.js +26 -0
- package/dist/esm/IconPicker/useGridColumns.js.map +1 -0
- package/dist/esm/IconPicker/useIconPickerBrowser.d.ts +10 -0
- package/dist/esm/IconPicker/useIconPickerBrowser.d.ts.map +1 -0
- package/dist/esm/IconPicker/useIconPickerBrowser.js +45 -0
- package/dist/esm/IconPicker/useIconPickerBrowser.js.map +1 -0
- package/dist/esm/IconPicker/useIsVisible.d.ts +12 -0
- package/dist/esm/IconPicker/useIsVisible.d.ts.map +1 -0
- package/dist/esm/IconPicker/useIsVisible.js +23 -0
- package/dist/esm/IconPicker/useIsVisible.js.map +1 -0
- package/dist/esm/IconPicker/useNarrowViewport.d.ts +9 -0
- package/dist/esm/IconPicker/useNarrowViewport.d.ts.map +1 -0
- package/dist/esm/IconPicker/useNarrowViewport.js +15 -0
- package/dist/esm/IconPicker/useNarrowViewport.js.map +1 -0
- package/dist/esm/IconPicker/useRovingFocus.d.ts +29 -0
- package/dist/esm/IconPicker/useRovingFocus.d.ts.map +1 -0
- package/dist/esm/IconPicker/useRovingFocus.js +70 -0
- package/dist/esm/IconPicker/useRovingFocus.js.map +1 -0
- package/dist/esm/styles.IconPicker.css +459 -0
- package/dist/esm/styles.css +456 -0
- package/dist/esm/types/parts.d.ts +28 -0
- package/dist/esm/types/parts.d.ts.map +1 -1
- package/dist/esm/types/parts.js +28 -0
- package/dist/esm/types/parts.js.map +1 -1
- package/package.json +7 -2
package/compat-manifest.json
CHANGED
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
{
|
|
69
69
|
"name": "@cratis/components",
|
|
70
70
|
"role": "core",
|
|
71
|
-
"version": "4.
|
|
71
|
+
"version": "4.24.0",
|
|
72
72
|
"releaseMajorRange": ">=4 <5",
|
|
73
73
|
"independentRelease": false,
|
|
74
74
|
"private": false,
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
{
|
|
93
93
|
"name": "@cratis/eslint-plugin-components",
|
|
94
94
|
"role": "eslint",
|
|
95
|
-
"version": "4.
|
|
95
|
+
"version": "4.24.0",
|
|
96
96
|
"releaseMajorRange": ">=4 <5",
|
|
97
97
|
"independentRelease": false,
|
|
98
98
|
"private": false,
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
{
|
|
106
106
|
"name": "@cratis/components.migrator",
|
|
107
107
|
"role": "migrator",
|
|
108
|
-
"version": "4.
|
|
108
|
+
"version": "4.24.0",
|
|
109
109
|
"releaseMajorRange": ">=4 <5",
|
|
110
110
|
"independentRelease": false,
|
|
111
111
|
"private": false,
|
|
@@ -116,13 +116,13 @@
|
|
|
116
116
|
{
|
|
117
117
|
"name": "@cratis/components.conformance",
|
|
118
118
|
"role": "conformance",
|
|
119
|
-
"version": "4.
|
|
119
|
+
"version": "4.24.0",
|
|
120
120
|
"releaseMajorRange": ">=4 <5",
|
|
121
121
|
"independentRelease": false,
|
|
122
122
|
"private": false,
|
|
123
123
|
"packageAccess": "public",
|
|
124
124
|
"peerDependencies": {
|
|
125
|
-
"@cratis/components": "4.
|
|
125
|
+
"@cratis/components": "4.24.0",
|
|
126
126
|
"react": "^19.0.0",
|
|
127
127
|
"react-dom": "^19.0.0"
|
|
128
128
|
},
|
|
@@ -132,13 +132,13 @@
|
|
|
132
132
|
{
|
|
133
133
|
"name": "@cratis/components.mui",
|
|
134
134
|
"role": "renderer-adapter",
|
|
135
|
-
"version": "4.
|
|
135
|
+
"version": "4.24.0",
|
|
136
136
|
"releaseMajorRange": ">=4 <5",
|
|
137
137
|
"independentRelease": false,
|
|
138
138
|
"private": false,
|
|
139
139
|
"packageAccess": "public",
|
|
140
140
|
"peerDependencies": {
|
|
141
|
-
"@cratis/components": "4.
|
|
141
|
+
"@cratis/components": "4.24.0",
|
|
142
142
|
"@emotion/react": ">=11.5 <12",
|
|
143
143
|
"@emotion/styled": ">=11.11 <12",
|
|
144
144
|
"@mui/material": ">=9 <10",
|
|
@@ -188,13 +188,13 @@
|
|
|
188
188
|
{
|
|
189
189
|
"name": "@cratis/components.primereact",
|
|
190
190
|
"role": "renderer-adapter",
|
|
191
|
-
"version": "4.
|
|
191
|
+
"version": "4.24.0",
|
|
192
192
|
"releaseMajorRange": ">=4 <5",
|
|
193
193
|
"independentRelease": false,
|
|
194
194
|
"private": false,
|
|
195
195
|
"packageAccess": "public",
|
|
196
196
|
"peerDependencies": {
|
|
197
|
-
"@cratis/components": "4.
|
|
197
|
+
"@cratis/components": "4.24.0",
|
|
198
198
|
"@primereact/core": ">=11 <12",
|
|
199
199
|
"@primereact/ui": ">=11 <12",
|
|
200
200
|
"@primeuix/themes": ">=3 <4",
|
|
@@ -256,13 +256,13 @@
|
|
|
256
256
|
{
|
|
257
257
|
"name": "@cratis/components.primereact10",
|
|
258
258
|
"role": "renderer-adapter",
|
|
259
|
-
"version": "4.
|
|
259
|
+
"version": "4.24.0",
|
|
260
260
|
"releaseMajorRange": ">=4 <5",
|
|
261
261
|
"independentRelease": false,
|
|
262
262
|
"private": false,
|
|
263
263
|
"packageAccess": "public",
|
|
264
264
|
"peerDependencies": {
|
|
265
|
-
"@cratis/components": "4.
|
|
265
|
+
"@cratis/components": "4.24.0",
|
|
266
266
|
"primereact": ">=10.9.9 <11",
|
|
267
267
|
"react": "^19.0.0",
|
|
268
268
|
"react-dom": "^19.0.0"
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { IconPickerAllowed } from './IconPickerAllowed.js';
|
|
2
|
+
import type { IconPickerCatalog } from './IconPickerCatalog.js';
|
|
3
|
+
import type { IconPickerLabels } from './IconPickerLabels.js';
|
|
4
|
+
import type { IconPickerParts } from './IconPickerParts.js';
|
|
5
|
+
import type { IconPickerPlacement } from './IconPickerPlacement.js';
|
|
6
|
+
import type { IconPickerValue } from './IconPickerValue.js';
|
|
7
|
+
/** Props for {@link IconPicker}. */
|
|
8
|
+
export interface IconPickerProps {
|
|
9
|
+
/** The selected icon's qualified identity, or nothing when none is selected. */
|
|
10
|
+
value: IconPickerValue | null | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Called with the qualified identity of the icon picked. Never called while the picker is
|
|
13
|
+
* read-only or disabled, or for an icon outside {@link IconPickerProps.allowed}.
|
|
14
|
+
* @param value The picked icon's `library`, `key` and `variant` - never its name, markup or position.
|
|
15
|
+
*/
|
|
16
|
+
onChange: (value: IconPickerValue) => void;
|
|
17
|
+
/** The icons on offer, supplied by the host. */
|
|
18
|
+
catalog: IconPickerCatalog;
|
|
19
|
+
/** Restricts what can be picked. Icons outside it are listed but cannot be selected. */
|
|
20
|
+
allowed?: IconPickerAllowed;
|
|
21
|
+
/** Shows the selection without letting it change. */
|
|
22
|
+
readOnly?: boolean;
|
|
23
|
+
/** Disables the picker. */
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/** Marks the selection as invalid. Also implied by a `validationMessage`. */
|
|
26
|
+
invalid?: boolean;
|
|
27
|
+
/** A validation message shown beneath the trigger; it marks the picker invalid. */
|
|
28
|
+
validationMessage?: string;
|
|
29
|
+
/** Where the popout opens relative to the trigger. Defaults to `'bottom start'`. */
|
|
30
|
+
placement?: IconPickerPlacement;
|
|
31
|
+
/** How many icons a compact category group lists before offering to show them all. Defaults to 12. */
|
|
32
|
+
compactGroupSize?: number;
|
|
33
|
+
/** Overrides for the picker's labels. Unset fields fall back to English. */
|
|
34
|
+
labels?: IconPickerLabels;
|
|
35
|
+
/** The trigger's element id, for a `<label htmlFor>`. */
|
|
36
|
+
id?: string;
|
|
37
|
+
/** The trigger's accessible name. The selected icon's name is appended. Defaults to the `trigger` label. */
|
|
38
|
+
'aria-label'?: string;
|
|
39
|
+
/** The id of the element naming the trigger. The selected icon's name is appended. */
|
|
40
|
+
'aria-labelledby'?: string;
|
|
41
|
+
/** The id of the element describing the trigger. */
|
|
42
|
+
'aria-describedby'?: string;
|
|
43
|
+
/** Extra class name on the picker's root. */
|
|
44
|
+
className?: string;
|
|
45
|
+
/** Pass-through attributes for the picker's stable parts. */
|
|
46
|
+
pt?: IconPickerParts;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* An icon property control: a closed trigger showing the selected glyph and name, which opens a
|
|
50
|
+
* searchable, categorized popout of the host's icon catalog.
|
|
51
|
+
*
|
|
52
|
+
* The picker is controlled and library-neutral. It browses exactly the catalog it is given, emits only
|
|
53
|
+
* a qualified `library`/`key`/`variant` identity, and never substitutes a same-named icon from another
|
|
54
|
+
* library for a selection it cannot find. On a narrow viewport the popout becomes a contained sheet.
|
|
55
|
+
*/
|
|
56
|
+
export declare const IconPicker: (props: IconPickerProps) => import("react").JSX.Element;
|
|
57
|
+
//# sourceMappingURL=IconPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPicker.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPicker.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAAuB,CAAC;AAGjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAczD,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC5B,gFAAgF;IAChF,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAE3C,gDAAgD;IAChD,OAAO,EAAE,iBAAiB,CAAC;IAE3B,wFAAwF;IACxF,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE5B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,oFAAoF;IACpF,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAEhC,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAE1B,yDAAyD;IACzD,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,4GAA4G;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6DAA6D;IAC7D,EAAE,CAAC,EAAE,eAAe,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,eAAe,gCA+HhD,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useId, useMemo } from 'react';
|
|
3
|
+
import { DialogTrigger } from 'react-aria-components/Dialog';
|
|
4
|
+
import { ModalOverlay, Modal } from 'react-aria-components/Modal';
|
|
5
|
+
import { Popover } from 'react-aria-components/Popover';
|
|
6
|
+
import { UNSAFE_PortalProvider } from 'react-aria';
|
|
7
|
+
import { classNames } from '../ClassNames/classNames.js';
|
|
8
|
+
import { unstable_useOverlayEnvironment } from '../renderer/RendererContext.js';
|
|
9
|
+
import { zIndexAboveDialog, OVERLAY_OFFSET } from '../renderer/dialogStack.js';
|
|
10
|
+
import { useNearestDialogZIndex } from '../renderer/DialogStackContext.js';
|
|
11
|
+
import { IconPickerPopout } from './IconPickerPopout.js';
|
|
12
|
+
import { IconPickerTrigger } from './IconPickerTrigger.js';
|
|
13
|
+
import { defaultIconPickerLabels } from './defaultIconPickerLabels.js';
|
|
14
|
+
import { formatIconPickerIdentity } from './formatIconPickerIdentity.js';
|
|
15
|
+
import { iconPickerIdentity } from './iconPickerIdentity.js';
|
|
16
|
+
import { isIconPickerAllowed } from './isIconPickerAllowed.js';
|
|
17
|
+
import { toIconPickerValue } from './toIconPickerValue.js';
|
|
18
|
+
import { useNarrowViewport } from './useNarrowViewport.js';
|
|
19
|
+
|
|
20
|
+
const defaultCompactGroupSize = 12;
|
|
21
|
+
const IconPicker = (props) => {
|
|
22
|
+
const { value, onChange, catalog, allowed, readOnly = false, disabled = false, placement = 'bottom start' } = props;
|
|
23
|
+
const labels = { ...defaultIconPickerLabels, ...props.labels };
|
|
24
|
+
const [open, setOpen] = useState(false);
|
|
25
|
+
const baseId = useId();
|
|
26
|
+
const overlayEnvironment = unstable_useOverlayEnvironment();
|
|
27
|
+
const nearestDialogZIndex = useNearestDialogZIndex();
|
|
28
|
+
const isNarrow = useNarrowViewport();
|
|
29
|
+
const editable = !disabled && !readOnly;
|
|
30
|
+
const invalid = props.invalid ?? props.validationMessage !== undefined;
|
|
31
|
+
const status = catalog.status ?? 'ready';
|
|
32
|
+
const zIndex = nearestDialogZIndex === null ? 'var(--cratis-z-index-overlay)' : zIndexAboveDialog(nearestDialogZIndex, OVERLAY_OFFSET);
|
|
33
|
+
const entry = useMemo(() => {
|
|
34
|
+
if (!value)
|
|
35
|
+
return undefined;
|
|
36
|
+
const identity = iconPickerIdentity(value);
|
|
37
|
+
return catalog.icons.find(candidate => iconPickerIdentity(candidate) === identity);
|
|
38
|
+
}, [catalog.icons, value]);
|
|
39
|
+
const missing = value != null && entry === undefined && status === 'ready';
|
|
40
|
+
const hasSeveralLibraries = catalog.libraries.length > 1;
|
|
41
|
+
const providerName = entry && hasSeveralLibraries
|
|
42
|
+
? (catalog.libraries.find(library => library.id === entry.library)?.name ?? entry.library)
|
|
43
|
+
: undefined;
|
|
44
|
+
const missingMessage = missing && value ? labels.missingSelection(formatIconPickerIdentity(value)) : undefined;
|
|
45
|
+
const messageId = `${baseId}-message`;
|
|
46
|
+
const hasMessage = missingMessage !== undefined || props.validationMessage !== undefined;
|
|
47
|
+
const describedBy = [props['aria-describedby'], hasMessage ? messageId : undefined].filter(Boolean).join(' ') || undefined;
|
|
48
|
+
const choose = (picked) => {
|
|
49
|
+
if (!editable || !isIconPickerAllowed(picked, allowed))
|
|
50
|
+
return;
|
|
51
|
+
onChange(toIconPickerValue(picked));
|
|
52
|
+
setOpen(false);
|
|
53
|
+
};
|
|
54
|
+
const popout = (jsx(IconPickerPopout, { catalog: catalog, value: value, allowed: allowed, labels: labels, compactGroupSize: props.compactGroupSize ?? defaultCompactGroupSize, onChoose: choose, onClose: () => setOpen(false), parts: props.pt }));
|
|
55
|
+
return (jsxs("div", { ...props.pt?.root, className: classNames('cratis-icon-picker', props.className, props.pt?.root?.className), "data-cratis-part": 'root', "data-disabled": disabled || undefined, "data-invalid": invalid || undefined, "data-readonly": readOnly || undefined, "data-open": open || undefined, children: [jsx(UNSAFE_PortalProvider, { getContainer: overlayEnvironment.getContainer, children: jsxs(DialogTrigger, { isOpen: open, onOpenChange: next => setOpen(next && editable), children: [jsx(IconPickerTrigger, { entry: entry, fallbackName: value ? formatIconPickerIdentity(value) : labels.placeholder, providerName: providerName, missing: missing, open: open, disabled: disabled, readOnly: readOnly, invalid: invalid, id: props.id, nameId: `${baseId}-name`, label: props['aria-label'] ?? labels.trigger, labelledBy: props['aria-labelledby'], describedBy: describedBy, parts: props.pt }), isNarrow ? (jsx(ModalOverlay, { isDismissable: true, className: 'cratis-icon-picker__overlay', style: { zIndex }, children: jsx(Modal, { ...props.pt?.popover, className: classNames('cratis-icon-picker__sheet', props.pt?.popover?.className), "data-cratis-part": 'popover', "data-open": true, children: popout }) })) : (jsx(Popover, { ...props.pt?.popover, placement: placement, className: classNames('cratis-icon-picker__popover', props.pt?.popover?.className), style: { zIndex, ...props.pt?.popover?.style }, "data-cratis-part": 'popover', "data-open": true, children: popout }))] }) }), hasMessage && (jsxs("div", { id: messageId, className: 'cratis-icon-picker__messages', children: [missingMessage !== undefined && (jsx("p", { ...props.pt?.message, className: classNames('cratis-icon-picker__message', props.pt?.message?.className), "data-cratis-part": 'message', children: missingMessage })), props.validationMessage !== undefined && (jsx("p", { ...props.pt?.message, className: classNames('cratis-icon-picker__message', props.pt?.message?.className), "data-cratis-part": 'message', children: props.validationMessage }))] }))] }));
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export { IconPicker };
|
|
59
|
+
//# sourceMappingURL=IconPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPicker.js","sources":["../../../IconPicker/IconPicker.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useId, useMemo, useState } from 'react';\nimport { DialogTrigger } from 'react-aria-components/Dialog';\nimport { Modal, ModalOverlay } from 'react-aria-components/Modal';\nimport { Popover } from 'react-aria-components/Popover';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { classNames } from '../ClassNames/classNames';\nimport { unstable_useOverlayEnvironment } from '../renderer/RendererContext';\nimport { OVERLAY_OFFSET, zIndexAboveDialog } from '../renderer/dialogStack';\nimport { useNearestDialogZIndex } from '../renderer/DialogStackContext';\nimport type { ExactPartKeys } from '../types/ExactPartKeys';\nimport type { PartsOf } from '../types/parts';\nimport type { IconPickerAllowed } from './IconPickerAllowed';\nimport type { IconPickerCatalog } from './IconPickerCatalog';\nimport type { IconPickerEntry } from './IconPickerEntry';\nimport type { IconPickerLabels } from './IconPickerLabels';\nimport type { IconPickerParts } from './IconPickerParts';\nimport type { IconPickerPlacement } from './IconPickerPlacement';\nimport { IconPickerPopout } from './IconPickerPopout';\nimport { IconPickerTrigger } from './IconPickerTrigger';\nimport type { IconPickerValue } from './IconPickerValue';\nimport { defaultIconPickerLabels } from './defaultIconPickerLabels';\nimport { formatIconPickerIdentity } from './formatIconPickerIdentity';\nimport { iconPickerIdentity } from './iconPickerIdentity';\nimport { isIconPickerAllowed } from './isIconPickerAllowed';\nimport { toIconPickerValue } from './toIconPickerValue';\nimport { useNarrowViewport } from './useNarrowViewport';\n\nconst iconPickerPartsMatchManifest: ExactPartKeys<IconPickerParts, PartsOf<'IconPicker'>> = true;\nvoid iconPickerPartsMatchManifest;\n\n/** How many icons a compact category group lists before offering to show them all. */\nconst defaultCompactGroupSize = 12;\n\n/** Props for {@link IconPicker}. */\nexport interface IconPickerProps {\n /** The selected icon's qualified identity, or nothing when none is selected. */\n value: IconPickerValue | null | undefined;\n\n /**\n * Called with the qualified identity of the icon picked. Never called while the picker is\n * read-only or disabled, or for an icon outside {@link IconPickerProps.allowed}.\n * @param value The picked icon's `library`, `key` and `variant` - never its name, markup or position.\n */\n onChange: (value: IconPickerValue) => void;\n\n /** The icons on offer, supplied by the host. */\n catalog: IconPickerCatalog;\n\n /** Restricts what can be picked. Icons outside it are listed but cannot be selected. */\n allowed?: IconPickerAllowed;\n\n /** Shows the selection without letting it change. */\n readOnly?: boolean;\n\n /** Disables the picker. */\n disabled?: boolean;\n\n /** Marks the selection as invalid. Also implied by a `validationMessage`. */\n invalid?: boolean;\n\n /** A validation message shown beneath the trigger; it marks the picker invalid. */\n validationMessage?: string;\n\n /** Where the popout opens relative to the trigger. Defaults to `'bottom start'`. */\n placement?: IconPickerPlacement;\n\n /** How many icons a compact category group lists before offering to show them all. Defaults to 12. */\n compactGroupSize?: number;\n\n /** Overrides for the picker's labels. Unset fields fall back to English. */\n labels?: IconPickerLabels;\n\n /** The trigger's element id, for a `<label htmlFor>`. */\n id?: string;\n\n /** The trigger's accessible name. The selected icon's name is appended. Defaults to the `trigger` label. */\n 'aria-label'?: string;\n\n /** The id of the element naming the trigger. The selected icon's name is appended. */\n 'aria-labelledby'?: string;\n\n /** The id of the element describing the trigger. */\n 'aria-describedby'?: string;\n\n /** Extra class name on the picker's root. */\n className?: string;\n\n /** Pass-through attributes for the picker's stable parts. */\n pt?: IconPickerParts;\n}\n\n/**\n * An icon property control: a closed trigger showing the selected glyph and name, which opens a\n * searchable, categorized popout of the host's icon catalog.\n *\n * The picker is controlled and library-neutral. It browses exactly the catalog it is given, emits only\n * a qualified `library`/`key`/`variant` identity, and never substitutes a same-named icon from another\n * library for a selection it cannot find. On a narrow viewport the popout becomes a contained sheet.\n */\nexport const IconPicker = (props: IconPickerProps) => {\n const { value, onChange, catalog, allowed, readOnly = false, disabled = false, placement = 'bottom start' } = props;\n const labels = { ...defaultIconPickerLabels, ...props.labels };\n const [open, setOpen] = useState(false);\n const baseId = useId();\n const overlayEnvironment = unstable_useOverlayEnvironment();\n const nearestDialogZIndex = useNearestDialogZIndex();\n const isNarrow = useNarrowViewport();\n const editable = !disabled && !readOnly;\n const invalid = props.invalid ?? props.validationMessage !== undefined;\n const status = catalog.status ?? 'ready';\n const zIndex =\n nearestDialogZIndex === null ? 'var(--cratis-z-index-overlay)' : zIndexAboveDialog(nearestDialogZIndex, OVERLAY_OFFSET);\n\n const entry = useMemo(() => {\n if (!value) return undefined;\n const identity = iconPickerIdentity(value);\n return catalog.icons.find(candidate => iconPickerIdentity(candidate) === identity);\n }, [catalog.icons, value]);\n const missing = value != null && entry === undefined && status === 'ready';\n const hasSeveralLibraries = catalog.libraries.length > 1;\n const providerName =\n entry && hasSeveralLibraries\n ? (catalog.libraries.find(library => library.id === entry.library)?.name ?? entry.library)\n : undefined;\n const missingMessage = missing && value ? labels.missingSelection(formatIconPickerIdentity(value)) : undefined;\n\n const messageId = `${baseId}-message`;\n const hasMessage = missingMessage !== undefined || props.validationMessage !== undefined;\n const describedBy = [props['aria-describedby'], hasMessage ? messageId : undefined].filter(Boolean).join(' ') || undefined;\n\n const choose = (picked: IconPickerEntry) => {\n if (!editable || !isIconPickerAllowed(picked, allowed)) return;\n onChange(toIconPickerValue(picked));\n setOpen(false);\n };\n\n const popout = (\n <IconPickerPopout\n catalog={catalog}\n value={value}\n allowed={allowed}\n labels={labels}\n compactGroupSize={props.compactGroupSize ?? defaultCompactGroupSize}\n onChoose={choose}\n onClose={() => setOpen(false)}\n parts={props.pt}\n />\n );\n\n return (\n <div\n {...props.pt?.root}\n className={classNames('cratis-icon-picker', props.className, props.pt?.root?.className)}\n data-cratis-part='root'\n data-disabled={disabled || undefined}\n data-invalid={invalid || undefined}\n data-readonly={readOnly || undefined}\n data-open={open || undefined}\n >\n <UNSAFE_PortalProvider getContainer={overlayEnvironment.getContainer}>\n <DialogTrigger isOpen={open} onOpenChange={next => setOpen(next && editable)}>\n <IconPickerTrigger\n entry={entry}\n fallbackName={value ? formatIconPickerIdentity(value) : labels.placeholder}\n providerName={providerName}\n missing={missing}\n open={open}\n disabled={disabled}\n readOnly={readOnly}\n invalid={invalid}\n id={props.id}\n nameId={`${baseId}-name`}\n label={props['aria-label'] ?? labels.trigger}\n labelledBy={props['aria-labelledby']}\n describedBy={describedBy}\n parts={props.pt}\n />\n {isNarrow ? (\n <ModalOverlay isDismissable className='cratis-icon-picker__overlay' style={{ zIndex }}>\n <Modal\n {...props.pt?.popover}\n className={classNames('cratis-icon-picker__sheet', props.pt?.popover?.className)}\n data-cratis-part='popover'\n data-open\n >\n {popout}\n </Modal>\n </ModalOverlay>\n ) : (\n <Popover\n {...props.pt?.popover}\n placement={placement}\n className={classNames('cratis-icon-picker__popover', props.pt?.popover?.className)}\n style={{ zIndex, ...props.pt?.popover?.style }}\n data-cratis-part='popover'\n data-open\n >\n {popout}\n </Popover>\n )}\n </DialogTrigger>\n </UNSAFE_PortalProvider>\n {hasMessage && (\n <div id={messageId} className='cratis-icon-picker__messages'>\n {missingMessage !== undefined && (\n <p\n {...props.pt?.message}\n className={classNames('cratis-icon-picker__message', props.pt?.message?.className)}\n data-cratis-part='message'\n >\n {missingMessage}\n </p>\n )}\n {props.validationMessage !== undefined && (\n <p\n {...props.pt?.message}\n className={classNames('cratis-icon-picker__message', props.pt?.message?.className)}\n data-cratis-part='message'\n >\n {props.validationMessage}\n </p>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;AAkCA,MAAM,uBAAuB,GAAG,EAAE;AAoE3B,MAAM,UAAU,GAAG,CAAC,KAAsB,KAAI;IACjD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,GAAG,cAAc,EAAE,GAAG,KAAK;IACnH,MAAM,MAAM,GAAG,EAAE,GAAG,uBAAuB,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE;IAC9D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AACvC,IAAA,MAAM,MAAM,GAAG,KAAK,EAAE;AACtB,IAAA,MAAM,kBAAkB,GAAG,8BAA8B,EAAE;AAC3D,IAAA,MAAM,mBAAmB,GAAG,sBAAsB,EAAE;AACpD,IAAA,MAAM,QAAQ,GAAG,iBAAiB,EAAE;AACpC,IAAA,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS;AACtE,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO;AACxC,IAAA,MAAM,MAAM,GACR,mBAAmB,KAAK,IAAI,GAAG,+BAA+B,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,cAAc,CAAC;AAE3H,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAK;AACvB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;AAC5B,QAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC;AAC1C,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC;IACtF,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC1B,IAAA,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO;IAC1E,MAAM,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;AACxD,IAAA,MAAM,YAAY,GACd,KAAK,IAAI;WACF,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO;UACvF,SAAS;IACnB,MAAM,cAAc,GAAG,OAAO,IAAI,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS;AAE9G,IAAA,MAAM,SAAS,GAAG,CAAA,EAAG,MAAM,UAAU;IACrC,MAAM,UAAU,GAAG,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS;AACxF,IAAA,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;AAE1H,IAAA,MAAM,MAAM,GAAG,CAAC,MAAuB,KAAI;QACvC,IAAI,CAAC,QAAQ,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC;YAAE;AACxD,QAAA,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC;AAClB,IAAA,CAAC;IAED,MAAM,MAAM,IACRA,GAAA,CAAC,gBAAgB,EAAA,EACb,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,uBAAuB,EACnE,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC7B,KAAK,EAAE,KAAK,CAAC,EAAE,EAAA,CACjB,CACL;AAED,IAAA,QACIC,IAAA,CAAA,KAAA,EAAA,EAAA,GACQ,KAAK,CAAC,EAAE,EAAE,IAAI,EAClB,SAAS,EAAE,UAAU,CAAC,oBAAoB,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,EAAA,kBAAA,EACtE,MAAM,mBACR,QAAQ,IAAI,SAAS,EAAA,cAAA,EACtB,OAAO,IAAI,SAAS,mBACnB,QAAQ,IAAI,SAAS,EAAA,WAAA,EACzB,IAAI,IAAI,SAAS,aAE5BD,GAAA,CAAC,qBAAqB,IAAC,YAAY,EAAE,kBAAkB,CAAC,YAAY,EAAA,QAAA,EAChEC,IAAA,CAAC,aAAa,EAAA,EAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAA,QAAA,EAAA,CACxED,GAAA,CAAC,iBAAiB,EAAA,EACd,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,EAC1E,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,MAAM,EAAE,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,EACxB,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,EAC5C,UAAU,EAAE,KAAK,CAAC,iBAAiB,CAAC,EACpC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,CAAC,EAAE,GACjB,EACD,QAAQ,IACLA,GAAA,CAAC,YAAY,IAAC,aAAa,EAAA,IAAA,EAAC,SAAS,EAAC,6BAA6B,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAA,QAAA,EACjFA,GAAA,CAAC,KAAK,EAAA,EAAA,GACE,KAAK,CAAC,EAAE,EAAE,OAAO,EACrB,SAAS,EAAE,UAAU,CAAC,2BAA2B,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,sBAC/D,SAAS,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAGzB,MAAM,EAAA,CACH,GACG,KAEfA,IAAC,OAAO,EAAA,EAAA,GACA,KAAK,CAAC,EAAE,EAAE,OAAO,EACrB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,UAAU,CAAC,6BAA6B,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,EAClF,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,sBAC7B,SAAS,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAGzB,MAAM,EAAA,CACD,CACb,CAAA,EAAA,CACW,EAAA,CACI,EACvB,UAAU,KACPC,IAAA,CAAA,KAAA,EAAA,EAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAA,CACvD,cAAc,KAAK,SAAS,KACzBD,GAAA,CAAA,GAAA,EAAA,EAAA,GACQ,KAAK,CAAC,EAAE,EAAE,OAAO,EACrB,SAAS,EAAE,UAAU,CAAC,6BAA6B,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,EAAA,kBAAA,EACjE,SAAS,EAAA,QAAA,EAEzB,cAAc,EAAA,CACf,CACP,EACA,KAAK,CAAC,iBAAiB,KAAK,SAAS,KAClCA,GAAA,CAAA,GAAA,EAAA,EAAA,GACQ,KAAK,CAAC,EAAE,EAAE,OAAO,EACrB,SAAS,EAAE,UAAU,CAAC,6BAA6B,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,EAAA,kBAAA,EACjE,SAAS,YAEzB,KAAK,CAAC,iBAAiB,EAAA,CACxB,CACP,IACC,CACT,CAAA,EAAA,CACC;AAEd;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IconPickerEntry } from './IconPickerEntry.js';
|
|
2
|
+
import type { IconPickerValue } from './IconPickerValue.js';
|
|
3
|
+
/**
|
|
4
|
+
* Which icons a field accepts: a list of qualified values, or a predicate over catalog entries.
|
|
5
|
+
* Icons outside it stay visible in the popout but cannot be selected.
|
|
6
|
+
*/
|
|
7
|
+
export type IconPickerAllowed = readonly IconPickerValue[] | ((entry: IconPickerEntry) => boolean);
|
|
8
|
+
//# sourceMappingURL=IconPickerAllowed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerAllowed.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerAllowed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,eAAe,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerAllowed.js","sourceRoot":"","sources":["../../../IconPicker/IconPickerAllowed.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IconPickerEntry } from './IconPickerEntry';\nimport type { IconPickerValue } from './IconPickerValue';\n\n/**\n * Which icons a field accepts: a list of qualified values, or a predicate over catalog entries.\n * Icons outside it stay visible in the popout but cannot be selected.\n */\nexport type IconPickerAllowed = readonly IconPickerValue[] | ((entry: IconPickerEntry) => boolean);\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { IconPickerBrowserGroup } from './IconPickerBrowserGroup.js';
|
|
2
|
+
import type { IconPickerEntry } from './IconPickerEntry.js';
|
|
3
|
+
/** What the popout shows and the controls that change it. */
|
|
4
|
+
export interface IconPickerBrowser {
|
|
5
|
+
/** The search as typed. */
|
|
6
|
+
query: string;
|
|
7
|
+
/** Changes the search. */
|
|
8
|
+
setQuery: (query: string) => void;
|
|
9
|
+
/** The active category filter - an empty string meaning icons with no category - or undefined for all. */
|
|
10
|
+
category: string | undefined;
|
|
11
|
+
/** Filters to a category, or lifts the filter with undefined. */
|
|
12
|
+
setCategory: (category: string | undefined) => void;
|
|
13
|
+
/** The id of the active library filter, or undefined for all. */
|
|
14
|
+
library: string | undefined;
|
|
15
|
+
/** Filters to a library, or lifts the filter with undefined. */
|
|
16
|
+
setLibrary: (library: string | undefined) => void;
|
|
17
|
+
/** Lifts the search and every filter. */
|
|
18
|
+
reset: () => void;
|
|
19
|
+
/** Whether a search or filter is active. */
|
|
20
|
+
isFiltered: boolean;
|
|
21
|
+
/** Every category that has a match, in order, with its match count - the options of the category filter. */
|
|
22
|
+
categories: IconPickerBrowserGroup[];
|
|
23
|
+
/** How many icons match the search and filters. */
|
|
24
|
+
matchCount: number;
|
|
25
|
+
/** Every matching icon, once each - what a search or a chosen category lists. */
|
|
26
|
+
matches: IconPickerEntry[];
|
|
27
|
+
/** The matches by category - what browsing with no search and no category lists. */
|
|
28
|
+
groups: IconPickerBrowserGroup[];
|
|
29
|
+
/** Whether to list `groups` (browsing) or `matches` (searching or a chosen category). */
|
|
30
|
+
isGrouped: boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=IconPickerBrowser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerBrowser.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerBrowser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEzD,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAC9B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,0GAA0G;IAC1G,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,iEAAiE;IACjE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAEpD,iEAAiE;IACjE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B,gEAAgE;IAChE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAElD,yCAAyC;IACzC,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IAEpB,4GAA4G;IAC5G,UAAU,EAAE,sBAAsB,EAAE,CAAC;IAErC,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IAEnB,iFAAiF;IACjF,OAAO,EAAE,eAAe,EAAE,CAAC;IAE3B,oFAAoF;IACpF,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAEjC,yFAAyF;IACzF,SAAS,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerBrowser.js","sourceRoot":"","sources":["../../../IconPicker/IconPickerBrowser.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IconPickerBrowserGroup } from './IconPickerBrowserGroup';\nimport type { IconPickerEntry } from './IconPickerEntry';\n\n/** What the popout shows and the controls that change it. */\nexport interface IconPickerBrowser {\n /** The search as typed. */\n query: string;\n\n /** Changes the search. */\n setQuery: (query: string) => void;\n\n /** The active category filter - an empty string meaning icons with no category - or undefined for all. */\n category: string | undefined;\n\n /** Filters to a category, or lifts the filter with undefined. */\n setCategory: (category: string | undefined) => void;\n\n /** The id of the active library filter, or undefined for all. */\n library: string | undefined;\n\n /** Filters to a library, or lifts the filter with undefined. */\n setLibrary: (library: string | undefined) => void;\n\n /** Lifts the search and every filter. */\n reset: () => void;\n\n /** Whether a search or filter is active. */\n isFiltered: boolean;\n\n /** Every category that has a match, in order, with its match count - the options of the category filter. */\n categories: IconPickerBrowserGroup[];\n\n /** How many icons match the search and filters. */\n matchCount: number;\n\n /** Every matching icon, once each - what a search or a chosen category lists. */\n matches: IconPickerEntry[];\n\n /** The matches by category - what browsing with no search and no category lists. */\n groups: IconPickerBrowserGroup[];\n\n /** Whether to list `groups` (browsing) or `matches` (searching or a chosen category). */\n isGrouped: boolean;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IconPickerEntry } from './IconPickerEntry.js';
|
|
2
|
+
/** One category's icons as the popout browses them. */
|
|
3
|
+
export interface IconPickerBrowserGroup {
|
|
4
|
+
/** The category name, or an empty string for the group of icons that list no category. */
|
|
5
|
+
category: string;
|
|
6
|
+
/** Every icon in the category that matches the active search and library. */
|
|
7
|
+
entries: IconPickerEntry[];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=IconPickerBrowserGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerBrowserGroup.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerBrowserGroup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEzD,uDAAuD;AACvD,MAAM,WAAW,sBAAsB;IACnC,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,OAAO,EAAE,eAAe,EAAE,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerBrowserGroup.js","sourceRoot":"","sources":["../../../IconPicker/IconPickerBrowserGroup.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IconPickerEntry } from './IconPickerEntry';\n\n/** One category's icons as the popout browses them. */\nexport interface IconPickerBrowserGroup {\n /** The category name, or an empty string for the group of icons that list no category. */\n category: string;\n\n /** Every icon in the category that matches the active search and library. */\n entries: IconPickerEntry[];\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IconPickerCatalogStatus } from './IconPickerCatalogStatus.js';
|
|
2
|
+
import type { IconPickerEntry } from './IconPickerEntry.js';
|
|
3
|
+
import type { IconPickerLibrary } from './IconPickerLibrary.js';
|
|
4
|
+
/**
|
|
5
|
+
* The effective icon catalog a host supplies to an `IconPicker`. The picker never resolves packages or
|
|
6
|
+
* loads icons itself; it browses and searches exactly what it is given, so a host adapts whatever
|
|
7
|
+
* icon source it has into this shape.
|
|
8
|
+
*/
|
|
9
|
+
export interface IconPickerCatalog {
|
|
10
|
+
/** The libraries the icons come from. */
|
|
11
|
+
libraries: readonly IconPickerLibrary[];
|
|
12
|
+
/** Every icon on offer. May grow while `status` is `loading`; the selection stays stable meanwhile. */
|
|
13
|
+
icons: readonly IconPickerEntry[];
|
|
14
|
+
/** Whether the catalog is complete. Defaults to `ready`. */
|
|
15
|
+
status?: IconPickerCatalogStatus;
|
|
16
|
+
/** What went wrong, shown when `status` is `error`. */
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=IconPickerCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerCatalog.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerCatalog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,yCAAyC;IACzC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAExC,uGAAuG;IACvG,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAElC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAEjC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerCatalog.js","sourceRoot":"","sources":["../../../IconPicker/IconPickerCatalog.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { IconPickerCatalogStatus } from './IconPickerCatalogStatus';\nimport type { IconPickerEntry } from './IconPickerEntry';\nimport type { IconPickerLibrary } from './IconPickerLibrary';\n\n/**\n * The effective icon catalog a host supplies to an `IconPicker`. The picker never resolves packages or\n * loads icons itself; it browses and searches exactly what it is given, so a host adapts whatever\n * icon source it has into this shape.\n */\nexport interface IconPickerCatalog {\n /** The libraries the icons come from. */\n libraries: readonly IconPickerLibrary[];\n\n /** Every icon on offer. May grow while `status` is `loading`; the selection stays stable meanwhile. */\n icons: readonly IconPickerEntry[];\n\n /** Whether the catalog is complete. Defaults to `ready`. */\n status?: IconPickerCatalogStatus;\n\n /** What went wrong, shown when `status` is `error`. */\n error?: string;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerCatalogStatus.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerCatalogStatus.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerCatalogStatus.js","sourceRoot":"","sources":["../../../IconPicker/IconPickerCatalogStatus.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** Whether the host has finished supplying an {@link IconPickerCatalog}. */\nexport type IconPickerCatalogStatus = 'ready' | 'loading' | 'error';\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { IconPickerBrowserGroup } from './IconPickerBrowserGroup.js';
|
|
2
|
+
import type { IconPickerParts } from './IconPickerParts.js';
|
|
3
|
+
/** Props for {@link IconPickerCategoryFilter}. */
|
|
4
|
+
export interface IconPickerCategoryFilterProps {
|
|
5
|
+
/** The categories that have a match, with their icons. */
|
|
6
|
+
categories: readonly IconPickerBrowserGroup[];
|
|
7
|
+
/** The active category - an empty string meaning icons with no category - or undefined for all. */
|
|
8
|
+
selected: string | undefined;
|
|
9
|
+
/** Changes the category filter. */
|
|
10
|
+
onSelect: (category: string | undefined) => void;
|
|
11
|
+
/** Accessible name of the filter. */
|
|
12
|
+
label: string;
|
|
13
|
+
/** The text of the option that shows every category. */
|
|
14
|
+
allLabel: string;
|
|
15
|
+
/** The name shown for icons that list no category. */
|
|
16
|
+
uncategorizedLabel: string;
|
|
17
|
+
/** Pass-through attributes for the filter and its options. */
|
|
18
|
+
parts?: Pick<IconPickerParts, 'categories' | 'category'>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The row of category options, a group of toggle buttons with one Tab stop and arrow-key movement. The
|
|
22
|
+
* active option is marked `aria-pressed`, and by a heavier border, not by color alone.
|
|
23
|
+
*/
|
|
24
|
+
export declare const IconPickerCategoryFilter: ({ categories, selected, onSelect, label, allLabel, uncategorizedLabel, parts, }: IconPickerCategoryFilterProps) => import("react").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=IconPickerCategoryFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerCategoryFilter.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerCategoryFilter.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAGzD,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC1C,0DAA0D;IAC1D,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAE9C,mGAAmG;IACnG,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,mCAAmC;IACnC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAEjD,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IAEd,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IAEjB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAE3B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,YAAY,GAAG,UAAU,CAAC,CAAC;CAC5D;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,oFAQlC,6BAA6B,gCA8C/B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { classNames } from '../ClassNames/classNames.js';
|
|
3
|
+
import { useRovingFocus } from './useRovingFocus.js';
|
|
4
|
+
|
|
5
|
+
const IconPickerCategoryFilter = ({ categories, selected, onSelect, label, allLabel, uncategorizedLabel, parts, }) => {
|
|
6
|
+
const options = [
|
|
7
|
+
{ category: undefined, text: allLabel },
|
|
8
|
+
...categories.map(group => ({
|
|
9
|
+
category: group.category,
|
|
10
|
+
text: group.category === '' ? uncategorizedLabel : group.category,
|
|
11
|
+
count: group.entries.length,
|
|
12
|
+
})),
|
|
13
|
+
];
|
|
14
|
+
const activeIndex = Math.max(options.findIndex(option => option.category === selected), 0);
|
|
15
|
+
const roving = useRovingFocus(options.length, 0, activeIndex);
|
|
16
|
+
return (jsx("div", { ...parts?.categories, ref: roving.containerRef, role: 'group', "aria-label": label, className: classNames('cratis-icon-picker__categories', parts?.categories?.className), "data-cratis-part": 'categories', onKeyDown: roving.onKeyDown, children: options.map((option, index) => {
|
|
17
|
+
const isSelected = option.category === selected;
|
|
18
|
+
return (jsxs("button", { ...parts?.category, ...roving.itemProps(index), type: 'button', "aria-pressed": isSelected, className: classNames('cratis-icon-picker__category', parts?.category?.className), "data-cratis-part": 'category', "data-selected": isSelected || undefined, onClick: () => onSelect(option.category), children: [option.text, option.count !== undefined && jsx("span", { className: 'cratis-icon-picker__count', children: option.count })] }, option.category === undefined ? 'all' : `category:${option.category}`));
|
|
19
|
+
}) }));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { IconPickerCategoryFilter };
|
|
23
|
+
//# sourceMappingURL=IconPickerCategoryFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerCategoryFilter.js","sources":["../../../IconPicker/IconPickerCategoryFilter.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { classNames } from '../ClassNames/classNames';\nimport type { IconPickerBrowserGroup } from './IconPickerBrowserGroup';\nimport type { IconPickerParts } from './IconPickerParts';\nimport { useRovingFocus } from './useRovingFocus';\n\n/** Props for {@link IconPickerCategoryFilter}. */\nexport interface IconPickerCategoryFilterProps {\n /** The categories that have a match, with their icons. */\n categories: readonly IconPickerBrowserGroup[];\n\n /** The active category - an empty string meaning icons with no category - or undefined for all. */\n selected: string | undefined;\n\n /** Changes the category filter. */\n onSelect: (category: string | undefined) => void;\n\n /** Accessible name of the filter. */\n label: string;\n\n /** The text of the option that shows every category. */\n allLabel: string;\n\n /** The name shown for icons that list no category. */\n uncategorizedLabel: string;\n\n /** Pass-through attributes for the filter and its options. */\n parts?: Pick<IconPickerParts, 'categories' | 'category'>;\n}\n\n/**\n * The row of category options, a group of toggle buttons with one Tab stop and arrow-key movement. The\n * active option is marked `aria-pressed`, and by a heavier border, not by color alone.\n */\nexport const IconPickerCategoryFilter = ({\n categories,\n selected,\n onSelect,\n label,\n allLabel,\n uncategorizedLabel,\n parts,\n}: IconPickerCategoryFilterProps) => {\n const options: { category: string | undefined; text: string; count?: number }[] = [\n { category: undefined, text: allLabel },\n ...categories.map(group => ({\n category: group.category,\n text: group.category === '' ? uncategorizedLabel : group.category,\n count: group.entries.length,\n })),\n ];\n const activeIndex = Math.max(\n options.findIndex(option => option.category === selected),\n 0,\n );\n const roving = useRovingFocus(options.length, 0, activeIndex);\n\n return (\n <div\n {...parts?.categories}\n ref={roving.containerRef}\n role='group'\n aria-label={label}\n className={classNames('cratis-icon-picker__categories', parts?.categories?.className)}\n data-cratis-part='categories'\n onKeyDown={roving.onKeyDown}\n >\n {options.map((option, index) => {\n const isSelected = option.category === selected;\n return (\n <button\n key={option.category === undefined ? 'all' : `category:${option.category}`}\n {...parts?.category}\n {...roving.itemProps(index)}\n type='button'\n aria-pressed={isSelected}\n className={classNames('cratis-icon-picker__category', parts?.category?.className)}\n data-cratis-part='category'\n data-selected={isSelected || undefined}\n onClick={() => onSelect(option.category)}\n >\n {option.text}\n {option.count !== undefined && <span className='cratis-icon-picker__count'>{option.count}</span>}\n </button>\n );\n })}\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;MAoCa,wBAAwB,GAAG,CAAC,EACrC,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,KAAK,GACuB,KAAI;AAChC,IAAA,MAAM,OAAO,GAAqE;AAC9E,QAAA,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvC,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;AACxB,YAAA,IAAI,EAAE,KAAK,CAAC,QAAQ,KAAK,EAAE,GAAG,kBAAkB,GAAG,KAAK,CAAC,QAAQ;AACjE,YAAA,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;AAC9B,SAAA,CAAC,CAAC;KACN;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CACxB,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,EACzD,CAAC,CACJ;AACD,IAAA,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC;IAE7D,QACIA,gBACQ,KAAK,EAAE,UAAU,EACrB,GAAG,EAAE,MAAM,CAAC,YAAY,EACxB,IAAI,EAAC,OAAO,EAAA,YAAA,EACA,KAAK,EACjB,SAAS,EAAE,UAAU,CAAC,gCAAgC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,sBACpE,YAAY,EAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,EAAA,QAAA,EAE1B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;AAC3B,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ;AAC/C,YAAA,QACIC,IAAA,CAAA,QAAA,EAAA,EAAA,GAEQ,KAAK,EAAE,QAAQ,EAAA,GACf,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAC3B,IAAI,EAAC,QAAQ,EAAA,cAAA,EACC,UAAU,EACxB,SAAS,EAAE,UAAU,CAAC,8BAA8B,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAA,kBAAA,EAChE,UAAU,EAAA,eAAA,EACZ,UAAU,IAAI,SAAS,EACtC,OAAO,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,aAEvC,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,KAAK,KAAK,SAAS,IAAID,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2BAA2B,YAAE,MAAM,CAAC,KAAK,EAAA,CAAQ,CAAA,EAAA,EAX3F,MAAM,CAAC,QAAQ,KAAK,SAAS,GAAG,KAAK,GAAG,YAAY,MAAM,CAAC,QAAQ,CAAA,CAAE,CAYrE;QAEjB,CAAC,CAAC,EAAA,CACA;AAEd;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { IconPickerValue } from './IconPickerValue.js';
|
|
3
|
+
/**
|
|
4
|
+
* One icon in an {@link IconPickerCatalog}: its qualified identity, how to find it, and how to draw it.
|
|
5
|
+
* Extends {@link IconPickerValue}, so the identity fields are exactly the ones the picker emits.
|
|
6
|
+
*/
|
|
7
|
+
export interface IconPickerEntry extends IconPickerValue {
|
|
8
|
+
/** The name shown beneath the icon and matched by search. */
|
|
9
|
+
name: string;
|
|
10
|
+
/** The categories the icon is listed under. An icon with none is listed under an "other" group. */
|
|
11
|
+
categories: readonly string[];
|
|
12
|
+
/** Extra words that find the icon in a search. */
|
|
13
|
+
tags?: readonly string[];
|
|
14
|
+
/** Alternative names that find the icon in a search. */
|
|
15
|
+
aliases?: readonly string[];
|
|
16
|
+
/** Marks the icon as deprecated: it stays selectable and visible, flagged so people can move off it. */
|
|
17
|
+
deprecated?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Draws the icon. Called lazily - only for icons scrolled into view - and never for an icon that
|
|
20
|
+
* stays off screen, so a large library costs nothing until it is browsed.
|
|
21
|
+
* @returns The icon's glyph, sized by the surrounding icon area.
|
|
22
|
+
*/
|
|
23
|
+
renderPreview: () => ReactNode;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=IconPickerEntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerEntry.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerEntry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACpD,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IAEb,mGAAmG;IACnG,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAE9B,kDAAkD;IAClD,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEzB,wDAAwD;IACxD,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE5B,wGAAwG;IACxG,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,aAAa,EAAE,MAAM,SAAS,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerEntry.js","sourceRoot":"","sources":["../../../IconPicker/IconPickerEntry.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\nimport type { IconPickerValue } from './IconPickerValue';\n\n/**\n * One icon in an {@link IconPickerCatalog}: its qualified identity, how to find it, and how to draw it.\n * Extends {@link IconPickerValue}, so the identity fields are exactly the ones the picker emits.\n */\nexport interface IconPickerEntry extends IconPickerValue {\n /** The name shown beneath the icon and matched by search. */\n name: string;\n\n /** The categories the icon is listed under. An icon with none is listed under an \"other\" group. */\n categories: readonly string[];\n\n /** Extra words that find the icon in a search. */\n tags?: readonly string[];\n\n /** Alternative names that find the icon in a search. */\n aliases?: readonly string[];\n\n /** Marks the icon as deprecated: it stays selectable and visible, flagged so people can move off it. */\n deprecated?: boolean;\n\n /**\n * Draws the icon. Called lazily - only for icons scrolled into view - and never for an icon that\n * stays off screen, so a large library costs nothing until it is browsed.\n * @returns The icon's glyph, sized by the surrounding icon area.\n */\n renderPreview: () => ReactNode;\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IconPickerEntry } from './IconPickerEntry.js';
|
|
2
|
+
import type { IconPickerParts } from './IconPickerParts.js';
|
|
3
|
+
/** Props for {@link IconPickerGrid}. */
|
|
4
|
+
export interface IconPickerGridProps {
|
|
5
|
+
/** The icons to list, in order. */
|
|
6
|
+
entries: readonly IconPickerEntry[];
|
|
7
|
+
/** The accessible name of the list. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** The identity string of the selected icon, if any. */
|
|
10
|
+
selectedIdentity: string | undefined;
|
|
11
|
+
/** Tells whether the field accepts an icon. */
|
|
12
|
+
isAllowed: (entry: IconPickerEntry) => boolean;
|
|
13
|
+
/** Resolves a library id to the name shown on the tile, or undefined to show none. */
|
|
14
|
+
providerName: (library: string) => string | undefined;
|
|
15
|
+
/** The text marking a deprecated icon. */
|
|
16
|
+
deprecatedLabel: string;
|
|
17
|
+
/** The text saying why an icon cannot be chosen. */
|
|
18
|
+
notAllowedLabel: string;
|
|
19
|
+
/** Picks an icon. */
|
|
20
|
+
onChoose: (entry: IconPickerEntry) => void;
|
|
21
|
+
/** Pass-through attributes for the grid and its tiles. */
|
|
22
|
+
parts?: IconPickerParts;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A grid of {@link IconPickerTile}s with one Tab stop. Arrow keys move focus a tile or a row at a
|
|
26
|
+
* time, and Home and End jump to the ends; the tab stop starts on the selected tile.
|
|
27
|
+
*/
|
|
28
|
+
export declare const IconPickerGrid: ({ entries, label, selectedIdentity, isAllowed, providerName, deprecatedLabel, notAllowedLabel, onChoose, parts, }: IconPickerGridProps) => import("react").JSX.Element;
|
|
29
|
+
//# sourceMappingURL=IconPickerGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerGrid.d.ts","sourceRoot":"","sources":["../../../IconPicker/IconPickerGrid.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAMzD,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAChC,mCAAmC;IACnC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAEpC,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IAEd,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC,+CAA+C;IAC/C,SAAS,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC;IAE/C,sFAAsF;IACtF,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAEtD,0CAA0C;IAC1C,eAAe,EAAE,MAAM,CAAC;IAExB,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IAExB,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAE3C,0DAA0D;IAC1D,KAAK,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,sHAUxB,mBAAmB,gCAsCrB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { classNames } from '../ClassNames/classNames.js';
|
|
4
|
+
import { IconPickerTile } from './IconPickerTile.js';
|
|
5
|
+
import { iconPickerIdentity } from './iconPickerIdentity.js';
|
|
6
|
+
import { useGridColumns } from './useGridColumns.js';
|
|
7
|
+
import { useRovingFocus } from './useRovingFocus.js';
|
|
8
|
+
|
|
9
|
+
const IconPickerGrid = ({ entries, label, selectedIdentity, isAllowed, providerName, deprecatedLabel, notAllowedLabel, onChoose, parts, }) => {
|
|
10
|
+
const gridRef = useRef(null);
|
|
11
|
+
const columns = useGridColumns(gridRef);
|
|
12
|
+
const selectedIndex = entries.findIndex(entry => iconPickerIdentity(entry) === selectedIdentity);
|
|
13
|
+
const roving = useRovingFocus(entries.length, columns, selectedIndex);
|
|
14
|
+
return (jsx("div", { ...parts?.grid, ref: element => {
|
|
15
|
+
gridRef.current = element;
|
|
16
|
+
roving.containerRef.current = element;
|
|
17
|
+
}, role: 'listbox', "aria-label": label, className: classNames('cratis-icon-picker__grid', parts?.grid?.className), "data-cratis-part": 'grid', onKeyDown: roving.onKeyDown, children: entries.map((entry, index) => {
|
|
18
|
+
const identity = iconPickerIdentity(entry);
|
|
19
|
+
return (jsx(IconPickerTile, { entry: entry, selected: identity === selectedIdentity, allowed: isAllowed(entry), providerName: providerName(entry.library), deprecatedLabel: deprecatedLabel, notAllowedLabel: notAllowedLabel, onChoose: onChoose, roving: roving.itemProps(index), parts: parts }, identity));
|
|
20
|
+
}) }));
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export { IconPickerGrid };
|
|
24
|
+
//# sourceMappingURL=IconPickerGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconPickerGrid.js","sources":["../../../IconPicker/IconPickerGrid.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useRef } from 'react';\nimport { classNames } from '../ClassNames/classNames';\nimport type { IconPickerEntry } from './IconPickerEntry';\nimport type { IconPickerParts } from './IconPickerParts';\nimport { IconPickerTile } from './IconPickerTile';\nimport { iconPickerIdentity } from './iconPickerIdentity';\nimport { useGridColumns } from './useGridColumns';\nimport { useRovingFocus } from './useRovingFocus';\n\n/** Props for {@link IconPickerGrid}. */\nexport interface IconPickerGridProps {\n /** The icons to list, in order. */\n entries: readonly IconPickerEntry[];\n\n /** The accessible name of the list. */\n label: string;\n\n /** The identity string of the selected icon, if any. */\n selectedIdentity: string | undefined;\n\n /** Tells whether the field accepts an icon. */\n isAllowed: (entry: IconPickerEntry) => boolean;\n\n /** Resolves a library id to the name shown on the tile, or undefined to show none. */\n providerName: (library: string) => string | undefined;\n\n /** The text marking a deprecated icon. */\n deprecatedLabel: string;\n\n /** The text saying why an icon cannot be chosen. */\n notAllowedLabel: string;\n\n /** Picks an icon. */\n onChoose: (entry: IconPickerEntry) => void;\n\n /** Pass-through attributes for the grid and its tiles. */\n parts?: IconPickerParts;\n}\n\n/**\n * A grid of {@link IconPickerTile}s with one Tab stop. Arrow keys move focus a tile or a row at a\n * time, and Home and End jump to the ends; the tab stop starts on the selected tile.\n */\nexport const IconPickerGrid = ({\n entries,\n label,\n selectedIdentity,\n isAllowed,\n providerName,\n deprecatedLabel,\n notAllowedLabel,\n onChoose,\n parts,\n}: IconPickerGridProps) => {\n const gridRef = useRef<HTMLDivElement | null>(null);\n const columns = useGridColumns(gridRef);\n const selectedIndex = entries.findIndex(entry => iconPickerIdentity(entry) === selectedIdentity);\n const roving = useRovingFocus(entries.length, columns, selectedIndex);\n\n return (\n <div\n {...parts?.grid}\n ref={element => {\n gridRef.current = element;\n roving.containerRef.current = element;\n }}\n role='listbox'\n aria-label={label}\n className={classNames('cratis-icon-picker__grid', parts?.grid?.className)}\n data-cratis-part='grid'\n onKeyDown={roving.onKeyDown}\n >\n {entries.map((entry, index) => {\n const identity = iconPickerIdentity(entry);\n return (\n <IconPickerTile\n key={identity}\n entry={entry}\n selected={identity === selectedIdentity}\n allowed={isAllowed(entry)}\n providerName={providerName(entry.library)}\n deprecatedLabel={deprecatedLabel}\n notAllowedLabel={notAllowedLabel}\n onChoose={onChoose}\n roving={roving.itemProps(index)}\n parts={parts}\n />\n );\n })}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;AA8CO,MAAM,cAAc,GAAG,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,eAAe,EACf,eAAe,EACf,QAAQ,EACR,KAAK,GACa,KAAI;AACtB,IAAA,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC;AACnD,IAAA,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;AACvC,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAAC;AAChG,IAAA,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;IAErE,QACIA,GAAA,CAAA,KAAA,EAAA,EAAA,GACQ,KAAK,EAAE,IAAI,EACf,GAAG,EAAE,OAAO,IAAG;AACX,YAAA,OAAO,CAAC,OAAO,GAAG,OAAO;AACzB,YAAA,MAAM,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO;AACzC,QAAA,CAAC,EACD,IAAI,EAAC,SAAS,EAAA,YAAA,EACF,KAAK,EACjB,SAAS,EAAE,UAAU,CAAC,0BAA0B,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,EAAA,kBAAA,EACxD,MAAM,EACvB,SAAS,EAAE,MAAM,CAAC,SAAS,EAAA,QAAA,EAE1B,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC1B,YAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC;YAC1C,QACIA,GAAA,CAAC,cAAc,EAAA,EAEX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,KAAK,gBAAgB,EACvC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,EACzB,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EACzC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAC/B,KAAK,EAAE,KAAK,EAAA,EATP,QAAQ,CAUf;QAEV,CAAC,CAAC,EAAA,CACA;AAEd;;"}
|