@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
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const defaultGridColumns = 4;
|
|
4
|
+
const useGridColumns = (grid) => {
|
|
5
|
+
const [columns, setColumns] = useState(defaultGridColumns);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const element = grid.current;
|
|
8
|
+
if (!element || typeof ResizeObserver === 'undefined')
|
|
9
|
+
return;
|
|
10
|
+
const measure = () => {
|
|
11
|
+
const tracks = getComputedStyle(element)
|
|
12
|
+
.gridTemplateColumns.split(' ')
|
|
13
|
+
.filter(track => track.endsWith('px')).length;
|
|
14
|
+
if (tracks > 0)
|
|
15
|
+
setColumns(tracks);
|
|
16
|
+
};
|
|
17
|
+
measure();
|
|
18
|
+
const observer = new ResizeObserver(measure);
|
|
19
|
+
observer.observe(element);
|
|
20
|
+
return () => observer.disconnect();
|
|
21
|
+
}, [grid]);
|
|
22
|
+
return columns;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { defaultGridColumns, useGridColumns };
|
|
26
|
+
//# sourceMappingURL=useGridColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGridColumns.js","sources":["../../../IconPicker/useGridColumns.ts"],"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 { useEffect, useState, type RefObject } from 'react';\n\n/** How many columns a grid is assumed to have until it has been measured. */\nexport const defaultGridColumns = 4;\n\n/**\n * Counts the columns a CSS grid currently lays out, so Up and Down can move a whole row. The browser\n * resolves `repeat(auto-fill, …)` into real tracks, so the count is read back from the grid's computed\n * style whenever it resizes. Environments that cannot lay out - or measure - a grid keep the default.\n * @param grid The grid element.\n * @returns The grid's column count.\n */\nexport const useGridColumns = (grid: RefObject<HTMLElement | null>): number => {\n const [columns, setColumns] = useState(defaultGridColumns);\n\n useEffect(() => {\n const element = grid.current;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const tracks = getComputedStyle(element)\n .gridTemplateColumns.split(' ')\n .filter(track => track.endsWith('px')).length;\n if (tracks > 0) setColumns(tracks);\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [grid]);\n\n return columns;\n};\n"],"names":[],"mappings":";;AAMO,MAAM,kBAAkB,GAAG;AAS3B,MAAM,cAAc,GAAG,CAAC,IAAmC,KAAY;IAC1E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IAE1D,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE;QACvD,MAAM,OAAO,GAAG,MAAK;AACjB,YAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO;AAClC,iBAAA,mBAAmB,CAAC,KAAK,CAAC,GAAG;AAC7B,iBAAA,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YACjD,IAAI,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,MAAM,CAAC;AACtC,QAAA,CAAC;AACD,QAAA,OAAO,EAAE;AACT,QAAA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC;AAC5C,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzB,QAAA,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE;AACtC,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAEV,IAAA,OAAO,OAAO;AAClB;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IconPickerBrowser } from './IconPickerBrowser.js';
|
|
2
|
+
import type { IconPickerEntry } from './IconPickerEntry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Holds the popout's search and filters and derives what they show. The search index is built once
|
|
5
|
+
* per catalog; typing only filters it, so a large library stays responsive.
|
|
6
|
+
* @param icons The catalog's icons.
|
|
7
|
+
* @returns What to show, and the controls that change it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const useIconPickerBrowser: (icons: readonly IconPickerEntry[]) => IconPickerBrowser;
|
|
10
|
+
//# sourceMappingURL=useIconPickerBrowser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIconPickerBrowser.d.ts","sourceRoot":"","sources":["../../../IconPicker/useIconPickerBrowser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAKzD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,UAAW,SAAS,eAAe,EAAE,KAAG,iBAyCxE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useState, useMemo } from 'react';
|
|
2
|
+
import { createIconPickerIndex } from './createIconPickerIndex.js';
|
|
3
|
+
import { groupIconPickerByCategory } from './groupIconPickerByCategory.js';
|
|
4
|
+
import { searchIconPickerIndex } from './searchIconPickerIndex.js';
|
|
5
|
+
|
|
6
|
+
const useIconPickerBrowser = (icons) => {
|
|
7
|
+
const [query, setQuery] = useState('');
|
|
8
|
+
const [category, setCategory] = useState();
|
|
9
|
+
const [library, setLibrary] = useState();
|
|
10
|
+
const index = useMemo(() => createIconPickerIndex(icons), [icons]);
|
|
11
|
+
return useMemo(() => {
|
|
12
|
+
const inLibrary = library === undefined ? index : index.filter(candidate => candidate.entry.library === library);
|
|
13
|
+
const searched = searchIconPickerIndex(inLibrary, query.trim());
|
|
14
|
+
const categories = groupIconPickerByCategory(searched);
|
|
15
|
+
const matchesCategory = category === undefined
|
|
16
|
+
? searched
|
|
17
|
+
: searched.filter(candidate => category === ''
|
|
18
|
+
? candidate.entry.categories.length === 0
|
|
19
|
+
: candidate.entry.categories.includes(category));
|
|
20
|
+
const matches = matchesCategory.map(candidate => candidate.entry);
|
|
21
|
+
const isFiltered = query.trim() !== '' || category !== undefined || library !== undefined;
|
|
22
|
+
return {
|
|
23
|
+
query,
|
|
24
|
+
setQuery,
|
|
25
|
+
category,
|
|
26
|
+
setCategory,
|
|
27
|
+
library,
|
|
28
|
+
setLibrary,
|
|
29
|
+
reset: () => {
|
|
30
|
+
setQuery('');
|
|
31
|
+
setCategory(undefined);
|
|
32
|
+
setLibrary(undefined);
|
|
33
|
+
},
|
|
34
|
+
isFiltered,
|
|
35
|
+
categories,
|
|
36
|
+
matchCount: matches.length,
|
|
37
|
+
matches,
|
|
38
|
+
groups: categories,
|
|
39
|
+
isGrouped: query.trim() === '' && category === undefined,
|
|
40
|
+
};
|
|
41
|
+
}, [index, query, category, library]);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { useIconPickerBrowser };
|
|
45
|
+
//# sourceMappingURL=useIconPickerBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIconPickerBrowser.js","sources":["../../../IconPicker/useIconPickerBrowser.ts"],"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 { useMemo, useState } from 'react';\nimport type { IconPickerBrowser } from './IconPickerBrowser';\nimport type { IconPickerEntry } from './IconPickerEntry';\nimport { createIconPickerIndex } from './createIconPickerIndex';\nimport { groupIconPickerByCategory } from './groupIconPickerByCategory';\nimport { searchIconPickerIndex } from './searchIconPickerIndex';\n\n/**\n * Holds the popout's search and filters and derives what they show. The search index is built once\n * per catalog; typing only filters it, so a large library stays responsive.\n * @param icons The catalog's icons.\n * @returns What to show, and the controls that change it.\n */\nexport const useIconPickerBrowser = (icons: readonly IconPickerEntry[]): IconPickerBrowser => {\n const [query, setQuery] = useState('');\n const [category, setCategory] = useState<string | undefined>();\n const [library, setLibrary] = useState<string | undefined>();\n const index = useMemo(() => createIconPickerIndex(icons), [icons]);\n\n return useMemo(() => {\n const inLibrary = library === undefined ? index : index.filter(candidate => candidate.entry.library === library);\n const searched = searchIconPickerIndex(inLibrary, query.trim());\n const categories = groupIconPickerByCategory(searched);\n const matchesCategory =\n category === undefined\n ? searched\n : searched.filter(candidate =>\n category === ''\n ? candidate.entry.categories.length === 0\n : candidate.entry.categories.includes(category),\n );\n const matches = matchesCategory.map(candidate => candidate.entry);\n const isFiltered = query.trim() !== '' || category !== undefined || library !== undefined;\n\n return {\n query,\n setQuery,\n category,\n setCategory,\n library,\n setLibrary,\n reset: () => {\n setQuery('');\n setCategory(undefined);\n setLibrary(undefined);\n },\n isFiltered,\n categories,\n matchCount: matches.length,\n matches,\n groups: categories,\n isGrouped: query.trim() === '' && category === undefined,\n };\n }, [index, query, category, library]);\n};\n"],"names":[],"mappings":";;;;;AAgBO,MAAM,oBAAoB,GAAG,CAAC,KAAiC,KAAuB;IACzF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;IACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAsB;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAsB;AAC5D,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAElE,OAAO,OAAO,CAAC,MAAK;AAChB,QAAA,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC;QAChH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAC/D,QAAA,MAAM,UAAU,GAAG,yBAAyB,CAAC,QAAQ,CAAC;AACtD,QAAA,MAAM,eAAe,GACjB,QAAQ,KAAK;AACT,cAAE;cACA,QAAQ,CAAC,MAAM,CAAC,SAAS,IACrB,QAAQ,KAAK;kBACP,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK;AACxC,kBAAE,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACtD;AACX,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC;AACjE,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAEzF,OAAO;YACH,KAAK;YACL,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,UAAU;YACV,KAAK,EAAE,MAAK;gBACR,QAAQ,CAAC,EAAE,CAAC;gBACZ,WAAW,CAAC,SAAS,CAAC;gBACtB,UAAU,CAAC,SAAS,CAAC;YACzB,CAAC;YACD,UAAU;YACV,UAAU;YACV,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,OAAO;AACP,YAAA,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,QAAQ,KAAK,SAAS;SAC3D;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reports whether an element has come near the viewport, and stays true once it has - a preview that
|
|
3
|
+
* has been drawn is kept rather than torn down when scrolled away. Environments without
|
|
4
|
+
* `IntersectionObserver` treat everything as visible.
|
|
5
|
+
* @param margin How far outside the viewport counts as near, as a CSS margin.
|
|
6
|
+
* @returns A ref to put on the element, and whether it has been near the viewport.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useIsVisible: (margin?: string) => {
|
|
9
|
+
ref: (element: HTMLElement | null) => void;
|
|
10
|
+
isVisible: boolean;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useIsVisible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsVisible.d.ts","sourceRoot":"","sources":["../../../IconPicker/useIsVisible.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;mBAOP,WAAW,GAAG,IAAI;;CAkBnC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
const useIsVisible = (margin = '160px') => {
|
|
4
|
+
const [isVisible, setIsVisible] = useState(typeof IntersectionObserver === 'undefined');
|
|
5
|
+
const observer = useRef(undefined);
|
|
6
|
+
useEffect(() => () => observer.current?.disconnect(), []);
|
|
7
|
+
const ref = useCallback((element) => {
|
|
8
|
+
observer.current?.disconnect();
|
|
9
|
+
if (!element || isVisible || typeof IntersectionObserver === 'undefined')
|
|
10
|
+
return;
|
|
11
|
+
observer.current = new IntersectionObserver(entries => {
|
|
12
|
+
if (entries.some(entry => entry.isIntersecting)) {
|
|
13
|
+
setIsVisible(true);
|
|
14
|
+
observer.current?.disconnect();
|
|
15
|
+
}
|
|
16
|
+
}, { rootMargin: margin });
|
|
17
|
+
observer.current.observe(element);
|
|
18
|
+
}, [isVisible, margin]);
|
|
19
|
+
return { ref, isVisible };
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { useIsVisible };
|
|
23
|
+
//# sourceMappingURL=useIsVisible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsVisible.js","sources":["../../../IconPicker/useIsVisible.ts"],"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 { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Reports whether an element has come near the viewport, and stays true once it has - a preview that\n * has been drawn is kept rather than torn down when scrolled away. Environments without\n * `IntersectionObserver` treat everything as visible.\n * @param margin How far outside the viewport counts as near, as a CSS margin.\n * @returns A ref to put on the element, and whether it has been near the viewport.\n */\nexport const useIsVisible = (margin = '160px') => {\n const [isVisible, setIsVisible] = useState(typeof IntersectionObserver === 'undefined');\n const observer = useRef<IntersectionObserver | undefined>(undefined);\n\n useEffect(() => () => observer.current?.disconnect(), []);\n\n const ref = useCallback(\n (element: HTMLElement | null) => {\n observer.current?.disconnect();\n if (!element || isVisible || typeof IntersectionObserver === 'undefined') return;\n observer.current = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n setIsVisible(true);\n observer.current?.disconnect();\n }\n },\n { rootMargin: margin },\n );\n observer.current.observe(element);\n },\n [isVisible, margin],\n );\n\n return { ref, isVisible };\n};\n"],"names":[],"mappings":";;MAYa,YAAY,GAAG,CAAC,MAAM,GAAG,OAAO,KAAI;AAC7C,IAAA,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,oBAAoB,KAAK,WAAW,CAAC;AACvF,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmC,SAAS,CAAC;AAEpE,IAAA,SAAS,CAAC,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAEzD,IAAA,MAAM,GAAG,GAAG,WAAW,CACnB,CAAC,OAA2B,KAAI;AAC5B,QAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE;QAC9B,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,OAAO,oBAAoB,KAAK,WAAW;YAAE;QAC1E,QAAQ,CAAC,OAAO,GAAG,IAAI,oBAAoB,CACvC,OAAO,IAAG;AACN,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE;gBAC7C,YAAY,CAAC,IAAI,CAAC;AAClB,gBAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE;YAClC;AACJ,QAAA,CAAC,EACD,EAAE,UAAU,EAAE,MAAM,EAAE,CACzB;AACD,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;AACrC,IAAA,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACtB;AAED,IAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE;AAC7B;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Viewports at most this wide show the popout as a contained sheet rather than anchored to the trigger. */
|
|
2
|
+
export declare const narrowViewportQuery = "(max-width: 30rem)";
|
|
3
|
+
/**
|
|
4
|
+
* Whether the viewport is narrow enough that the popout should be a sheet. Server rendering and
|
|
5
|
+
* environments without `matchMedia` are never narrow.
|
|
6
|
+
* @returns True on a narrow viewport.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useNarrowViewport: () => boolean;
|
|
9
|
+
//# sourceMappingURL=useNarrowViewport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNarrowViewport.d.ts","sourceRoot":"","sources":["../../../IconPicker/useNarrowViewport.ts"],"names":[],"mappings":"AAKA,4GAA4G;AAC5G,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAYxD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAA6D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useSyncExternalStore } from 'react';
|
|
2
|
+
|
|
3
|
+
const narrowViewportQuery = '(max-width: 30rem)';
|
|
4
|
+
const subscribe = (notify) => {
|
|
5
|
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
|
|
6
|
+
return () => undefined;
|
|
7
|
+
const query = window.matchMedia(narrowViewportQuery);
|
|
8
|
+
query.addEventListener('change', notify);
|
|
9
|
+
return () => query.removeEventListener('change', notify);
|
|
10
|
+
};
|
|
11
|
+
const read = () => typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia(narrowViewportQuery).matches;
|
|
12
|
+
const useNarrowViewport = () => useSyncExternalStore(subscribe, read, () => false);
|
|
13
|
+
|
|
14
|
+
export { narrowViewportQuery, useNarrowViewport };
|
|
15
|
+
//# sourceMappingURL=useNarrowViewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNarrowViewport.js","sources":["../../../IconPicker/useNarrowViewport.ts"],"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 { useSyncExternalStore } from 'react';\n\n/** Viewports at most this wide show the popout as a contained sheet rather than anchored to the trigger. */\nexport const narrowViewportQuery = '(max-width: 30rem)';\n\nconst subscribe = (notify: () => void) => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => undefined;\n const query = window.matchMedia(narrowViewportQuery);\n query.addEventListener('change', notify);\n return () => query.removeEventListener('change', notify);\n};\n\nconst read = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia(narrowViewportQuery).matches;\n\n/**\n * Whether the viewport is narrow enough that the popout should be a sheet. Server rendering and\n * environments without `matchMedia` are never narrow.\n * @returns True on a narrow viewport.\n */\nexport const useNarrowViewport = (): boolean => useSyncExternalStore(subscribe, read, () => false);\n"],"names":[],"mappings":";;AAMO,MAAM,mBAAmB,GAAG;AAEnC,MAAM,SAAS,GAAG,CAAC,MAAkB,KAAI;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;AAAE,QAAA,OAAO,MAAM,SAAS;IACpG,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC;AACpD,IAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACxC,OAAO,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC5D,CAAC;AAED,MAAM,IAAI,GAAG,MACT,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,OAAO;AAOvH,MAAM,iBAAiB,GAAG,MAAe,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type KeyboardEvent, type RefObject } from 'react';
|
|
2
|
+
/** What {@link useRovingFocus} hands to the container and each item. */
|
|
3
|
+
export interface RovingFocus {
|
|
4
|
+
/** The container the items live in. */
|
|
5
|
+
containerRef: RefObject<HTMLDivElement | null>;
|
|
6
|
+
/** Moves focus between items; put on the container. */
|
|
7
|
+
onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
|
|
8
|
+
/**
|
|
9
|
+
* The props of the item at an index: its tab stop, its index marker, and the focus handler that
|
|
10
|
+
* keeps the tab stop where focus last was.
|
|
11
|
+
* @param index The item's index.
|
|
12
|
+
*/
|
|
13
|
+
itemProps: (index: number) => {
|
|
14
|
+
tabIndex: number;
|
|
15
|
+
onFocus: () => void;
|
|
16
|
+
[attribute: `data-${string}`]: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A roving tab stop over a row or grid of items: one item is reachable with Tab, and the arrow keys,
|
|
21
|
+
* Home and End move focus among the rest. Items are located through their `data-roving-index`
|
|
22
|
+
* attribute, so they can be any element.
|
|
23
|
+
* @param count How many items there are.
|
|
24
|
+
* @param columns How many items make a row. Zero for a single row, where only Left/Right move focus.
|
|
25
|
+
* @param preferredIndex The item to make the tab stop when focus has not moved yet, such as the selection.
|
|
26
|
+
* @returns What to put on the container and on each item.
|
|
27
|
+
*/
|
|
28
|
+
export declare const useRovingFocus: (count: number, columns: number, preferredIndex?: number) => RovingFocus;
|
|
29
|
+
//# sourceMappingURL=useRovingFocus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRovingFocus.d.ts","sourceRoot":"","sources":["../../../IconPicker/useRovingFocus.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQxF,wEAAwE;AACxE,MAAM,WAAW,WAAW;IACxB,uCAAuC;IACvC,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAE/C,uDAAuD;IACvD,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAEvD;;;;OAIG;IACH,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,CAAC,SAAS,EAAE,QAAQ,MAAM,EAAE,GAAG,MAAM,CAAC;KACzC,CAAC;CACL;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,UAAW,MAAM,WAAW,MAAM,8BAAuB,WA6DnF,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useRef, useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const itemAttribute = 'data-roving-index';
|
|
4
|
+
const isRightToLeft = (element) => getComputedStyle(element).direction === 'rtl' || element.closest('[dir="rtl"]') !== null;
|
|
5
|
+
const useRovingFocus = (count, columns, preferredIndex = 0) => {
|
|
6
|
+
const containerRef = useRef(null);
|
|
7
|
+
const [focusedIndex, setFocusedIndex] = useState();
|
|
8
|
+
const tabStop = focusedIndex !== undefined && focusedIndex < count ? focusedIndex : Math.min(Math.max(preferredIndex, 0), Math.max(count - 1, 0));
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (focusedIndex !== undefined && focusedIndex >= count)
|
|
11
|
+
setFocusedIndex(undefined);
|
|
12
|
+
}, [count, focusedIndex]);
|
|
13
|
+
const focusItem = (index) => {
|
|
14
|
+
const target = containerRef.current?.querySelector(`[${itemAttribute}="${index}"]`);
|
|
15
|
+
if (!target)
|
|
16
|
+
return;
|
|
17
|
+
setFocusedIndex(index);
|
|
18
|
+
target.focus();
|
|
19
|
+
};
|
|
20
|
+
const onKeyDown = (event) => {
|
|
21
|
+
if (event.altKey || event.ctrlKey || event.metaKey)
|
|
22
|
+
return;
|
|
23
|
+
const current = event.target.closest(`[${itemAttribute}]`);
|
|
24
|
+
if (!current || !containerRef.current?.contains(current))
|
|
25
|
+
return;
|
|
26
|
+
const index = Number(current.getAttribute(itemAttribute));
|
|
27
|
+
const step = columns > 0 ? columns : 0;
|
|
28
|
+
const forward = isRightToLeft(containerRef.current) ? 'ArrowLeft' : 'ArrowRight';
|
|
29
|
+
let next;
|
|
30
|
+
switch (event.key) {
|
|
31
|
+
case 'ArrowRight':
|
|
32
|
+
case 'ArrowLeft':
|
|
33
|
+
next = event.key === forward ? index + 1 : index - 1;
|
|
34
|
+
break;
|
|
35
|
+
case 'ArrowDown':
|
|
36
|
+
if (step > 0)
|
|
37
|
+
next = index + step;
|
|
38
|
+
break;
|
|
39
|
+
case 'ArrowUp':
|
|
40
|
+
if (step > 0)
|
|
41
|
+
next = index - step;
|
|
42
|
+
break;
|
|
43
|
+
case 'Home':
|
|
44
|
+
next = 0;
|
|
45
|
+
break;
|
|
46
|
+
case 'End':
|
|
47
|
+
next = count - 1;
|
|
48
|
+
break;
|
|
49
|
+
default:
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (next === undefined)
|
|
53
|
+
return;
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
if (next >= 0 && next < count)
|
|
56
|
+
focusItem(next);
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
containerRef,
|
|
60
|
+
onKeyDown,
|
|
61
|
+
itemProps: index => ({
|
|
62
|
+
tabIndex: index === tabStop ? 0 : -1,
|
|
63
|
+
onFocus: () => setFocusedIndex(index),
|
|
64
|
+
[itemAttribute]: index,
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { useRovingFocus };
|
|
70
|
+
//# sourceMappingURL=useRovingFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRovingFocus.js","sources":["../../../IconPicker/useRovingFocus.ts"],"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 { useEffect, useRef, useState, type KeyboardEvent, type RefObject } from 'react';\n\n/** The attribute every roving item carries, holding its index. */\nconst itemAttribute = 'data-roving-index';\n\nconst isRightToLeft = (element: HTMLElement) =>\n getComputedStyle(element).direction === 'rtl' || element.closest('[dir=\"rtl\"]') !== null;\n\n/** What {@link useRovingFocus} hands to the container and each item. */\nexport interface RovingFocus {\n /** The container the items live in. */\n containerRef: RefObject<HTMLDivElement | null>;\n\n /** Moves focus between items; put on the container. */\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\n /**\n * The props of the item at an index: its tab stop, its index marker, and the focus handler that\n * keeps the tab stop where focus last was.\n * @param index The item's index.\n */\n itemProps: (index: number) => {\n tabIndex: number;\n onFocus: () => void;\n [attribute: `data-${string}`]: number;\n };\n}\n\n/**\n * A roving tab stop over a row or grid of items: one item is reachable with Tab, and the arrow keys,\n * Home and End move focus among the rest. Items are located through their `data-roving-index`\n * attribute, so they can be any element.\n * @param count How many items there are.\n * @param columns How many items make a row. Zero for a single row, where only Left/Right move focus.\n * @param preferredIndex The item to make the tab stop when focus has not moved yet, such as the selection.\n * @returns What to put on the container and on each item.\n */\nexport const useRovingFocus = (count: number, columns: number, preferredIndex = 0): RovingFocus => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [focusedIndex, setFocusedIndex] = useState<number | undefined>();\n\n // The tab stop falls back to the preferred item when the focused one is no longer in the list.\n const tabStop = focusedIndex !== undefined && focusedIndex < count ? focusedIndex : Math.min(Math.max(preferredIndex, 0), Math.max(count - 1, 0));\n\n useEffect(() => {\n if (focusedIndex !== undefined && focusedIndex >= count) setFocusedIndex(undefined);\n }, [count, focusedIndex]);\n\n const focusItem = (index: number) => {\n const target = containerRef.current?.querySelector<HTMLElement>(`[${itemAttribute}=\"${index}\"]`);\n if (!target) return;\n setFocusedIndex(index);\n target.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const current = (event.target as HTMLElement).closest<HTMLElement>(`[${itemAttribute}]`);\n if (!current || !containerRef.current?.contains(current)) return;\n const index = Number(current.getAttribute(itemAttribute));\n const step = columns > 0 ? columns : 0;\n // Right and Left name visual directions, so they swap places in a right-to-left layout.\n const forward = isRightToLeft(containerRef.current) ? 'ArrowLeft' : 'ArrowRight';\n let next: number | undefined;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowLeft':\n next = event.key === forward ? index + 1 : index - 1;\n break;\n case 'ArrowDown':\n if (step > 0) next = index + step;\n break;\n case 'ArrowUp':\n if (step > 0) next = index - step;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = count - 1;\n break;\n default:\n return;\n }\n if (next === undefined) return;\n event.preventDefault();\n if (next >= 0 && next < count) focusItem(next);\n };\n\n return {\n containerRef,\n onKeyDown,\n itemProps: index => ({\n tabIndex: index === tabStop ? 0 : -1,\n onFocus: () => setFocusedIndex(index),\n [itemAttribute]: index,\n }),\n };\n};\n"],"names":[],"mappings":"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"}
|