@cratis/scene.blueprint.default 4.31.0 → 4.33.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/ComponentName.ts +24 -0
- package/defaultBlueprint.ts +2 -1
- package/defaultBlueprintComponentMetadata.ts +2 -0
- package/defaultBlueprintComponents.ts +9 -0
- package/dist/cjs/ComponentName.js +8 -0
- package/dist/cjs/ComponentName.js.map +1 -1
- package/dist/cjs/defaultBlueprint.js +9 -5
- package/dist/cjs/defaultBlueprint.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponentMetadata.js +8 -0
- package/dist/cjs/defaultBlueprintComponentMetadata.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponents.js +21 -1
- package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
- package/dist/cjs/foundation/ActionButton.js +33 -0
- package/dist/cjs/foundation/ActionButton.js.map +1 -0
- package/dist/cjs/foundation/ChartWrapper.js +520 -0
- package/dist/cjs/foundation/ChartWrapper.js.map +1 -0
- package/dist/cjs/foundation/ColumnChooser.js +156 -0
- package/dist/cjs/foundation/ColumnChooser.js.map +1 -0
- package/dist/cjs/foundation/ComponentState.js +42 -0
- package/dist/cjs/foundation/ComponentState.js.map +1 -0
- package/dist/cjs/foundation/EmptyState.js +31 -0
- package/dist/cjs/foundation/EmptyState.js.map +1 -0
- package/dist/cjs/foundation/FilterBuilder.js +307 -0
- package/dist/cjs/foundation/FilterBuilder.js.map +1 -0
- package/dist/cjs/foundation/FoundationIcon.js +58 -0
- package/dist/cjs/foundation/FoundationIcon.js.map +1 -0
- package/dist/cjs/foundation/FoundationStates.js +62 -0
- package/dist/cjs/foundation/FoundationStates.js.map +1 -0
- package/dist/cjs/foundation/PermissionRule.js +22 -0
- package/dist/cjs/foundation/PermissionRule.js.map +1 -0
- package/dist/cjs/foundation/SavedViewsMenu.js +199 -0
- package/dist/cjs/foundation/SavedViewsMenu.js.map +1 -0
- package/dist/cjs/foundation/StatCard.js +61 -0
- package/dist/cjs/foundation/StatCard.js.map +1 -0
- package/dist/cjs/foundation/StateFrame.js +200 -0
- package/dist/cjs/foundation/StateFrame.js.map +1 -0
- package/dist/cjs/foundation/StatusChip.js +64 -0
- package/dist/cjs/foundation/StatusChip.js.map +1 -0
- package/dist/cjs/foundation/TrendChip.js +93 -0
- package/dist/cjs/foundation/TrendChip.js.map +1 -0
- package/dist/cjs/foundation/chartGeometry.js +101 -0
- package/dist/cjs/foundation/chartGeometry.js.map +1 -0
- package/dist/cjs/foundation/columnModel.js +43 -0
- package/dist/cjs/foundation/columnModel.js.map +1 -0
- package/dist/cjs/foundation/filterModel.js +123 -0
- package/dist/cjs/foundation/filterModel.js.map +1 -0
- package/dist/cjs/foundation/formatting.js +85 -0
- package/dist/cjs/foundation/formatting.js.map +1 -0
- package/dist/cjs/foundation/foundationComponentMetadata.js +69 -0
- package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -0
- package/dist/cjs/foundation/foundationDescriptors.js +385 -0
- package/dist/cjs/foundation/foundationDescriptors.js.map +1 -0
- package/dist/cjs/foundation/foundationSamples.js +201 -0
- package/dist/cjs/foundation/foundationSamples.js.map +1 -0
- package/dist/cjs/foundation/foundationStrings.js +130 -0
- package/dist/cjs/foundation/foundationStrings.js.map +1 -0
- package/dist/cjs/foundation/useElementWidth.js +31 -0
- package/dist/cjs/foundation/useElementWidth.js.map +1 -0
- package/dist/cjs/foundation/viewModel.js +24 -0
- package/dist/cjs/foundation/viewModel.js.map +1 -0
- package/dist/cjs/index.js +90 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/themes/dark.js +9 -1
- package/dist/cjs/themes/dark.js.map +1 -1
- package/dist/cjs/themes/light.js +10 -2
- package/dist/cjs/themes/light.js.map +1 -1
- package/dist/esm/ComponentName.d.ts +9 -1
- package/dist/esm/ComponentName.d.ts.map +1 -1
- package/dist/esm/ComponentName.js +8 -0
- package/dist/esm/ComponentName.js.map +1 -1
- package/dist/esm/defaultBlueprint.d.ts.map +1 -1
- package/dist/esm/defaultBlueprint.js +9 -5
- package/dist/esm/defaultBlueprint.js.map +1 -1
- package/dist/esm/defaultBlueprintComponentMetadata.d.ts.map +1 -1
- package/dist/esm/defaultBlueprintComponentMetadata.js +8 -0
- package/dist/esm/defaultBlueprintComponentMetadata.js.map +1 -1
- package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
- package/dist/esm/defaultBlueprintComponents.js +21 -1
- package/dist/esm/defaultBlueprintComponents.js.map +1 -1
- package/dist/esm/foundation/ActionButton.d.ts +13 -0
- package/dist/esm/foundation/ActionButton.d.ts.map +1 -0
- package/dist/esm/foundation/ActionButton.js +31 -0
- package/dist/esm/foundation/ActionButton.js.map +1 -0
- package/dist/esm/foundation/ChartWrapper.d.ts +5 -0
- package/dist/esm/foundation/ChartWrapper.d.ts.map +1 -0
- package/dist/esm/foundation/ChartWrapper.js +517 -0
- package/dist/esm/foundation/ChartWrapper.js.map +1 -0
- package/dist/esm/foundation/ColumnChooser.d.ts +3 -0
- package/dist/esm/foundation/ColumnChooser.d.ts.map +1 -0
- package/dist/esm/foundation/ColumnChooser.js +154 -0
- package/dist/esm/foundation/ColumnChooser.js.map +1 -0
- package/dist/esm/foundation/ComponentState.d.ts +12 -0
- package/dist/esm/foundation/ComponentState.d.ts.map +1 -0
- package/dist/esm/foundation/ComponentState.js +38 -0
- package/dist/esm/foundation/ComponentState.js.map +1 -0
- package/dist/esm/foundation/EmptyState.d.ts +3 -0
- package/dist/esm/foundation/EmptyState.d.ts.map +1 -0
- package/dist/esm/foundation/EmptyState.js +29 -0
- package/dist/esm/foundation/EmptyState.js.map +1 -0
- package/dist/esm/foundation/FilterBuilder.d.ts +3 -0
- package/dist/esm/foundation/FilterBuilder.d.ts.map +1 -0
- package/dist/esm/foundation/FilterBuilder.js +305 -0
- package/dist/esm/foundation/FilterBuilder.js.map +1 -0
- package/dist/esm/foundation/Foundation.stories.d.ts +37 -0
- package/dist/esm/foundation/Foundation.stories.d.ts.map +1 -0
- package/dist/esm/foundation/Foundation.stories.js +34 -0
- package/dist/esm/foundation/Foundation.stories.js.map +1 -0
- package/dist/esm/foundation/FoundationIcon.d.ts +7 -0
- package/dist/esm/foundation/FoundationIcon.d.ts.map +1 -0
- package/dist/esm/foundation/FoundationIcon.js +55 -0
- package/dist/esm/foundation/FoundationIcon.js.map +1 -0
- package/dist/esm/foundation/FoundationStates.d.ts +8 -0
- package/dist/esm/foundation/FoundationStates.d.ts.map +1 -0
- package/dist/esm/foundation/FoundationStates.js +60 -0
- package/dist/esm/foundation/FoundationStates.js.map +1 -0
- package/dist/esm/foundation/PermissionRule.d.ts +8 -0
- package/dist/esm/foundation/PermissionRule.d.ts.map +1 -0
- package/dist/esm/foundation/PermissionRule.js +19 -0
- package/dist/esm/foundation/PermissionRule.js.map +1 -0
- package/dist/esm/foundation/SavedViewsMenu.d.ts +4 -0
- package/dist/esm/foundation/SavedViewsMenu.d.ts.map +1 -0
- package/dist/esm/foundation/SavedViewsMenu.js +196 -0
- package/dist/esm/foundation/SavedViewsMenu.js.map +1 -0
- package/dist/esm/foundation/StatCard.d.ts +3 -0
- package/dist/esm/foundation/StatCard.d.ts.map +1 -0
- package/dist/esm/foundation/StatCard.js +59 -0
- package/dist/esm/foundation/StatCard.js.map +1 -0
- package/dist/esm/foundation/StateFrame.d.ts +15 -0
- package/dist/esm/foundation/StateFrame.d.ts.map +1 -0
- package/dist/esm/foundation/StateFrame.js +197 -0
- package/dist/esm/foundation/StateFrame.js.map +1 -0
- package/dist/esm/foundation/StatusChip.d.ts +13 -0
- package/dist/esm/foundation/StatusChip.d.ts.map +1 -0
- package/dist/esm/foundation/StatusChip.js +59 -0
- package/dist/esm/foundation/StatusChip.js.map +1 -0
- package/dist/esm/foundation/TrendChip.d.ts +18 -0
- package/dist/esm/foundation/TrendChip.d.ts.map +1 -0
- package/dist/esm/foundation/TrendChip.js +88 -0
- package/dist/esm/foundation/TrendChip.js.map +1 -0
- package/dist/esm/foundation/chartGeometry.d.ts +34 -0
- package/dist/esm/foundation/chartGeometry.d.ts.map +1 -0
- package/dist/esm/foundation/chartGeometry.js +93 -0
- package/dist/esm/foundation/chartGeometry.js.map +1 -0
- package/dist/esm/foundation/columnModel.d.ts +11 -0
- package/dist/esm/foundation/columnModel.d.ts.map +1 -0
- package/dist/esm/foundation/columnModel.js +38 -0
- package/dist/esm/foundation/columnModel.js.map +1 -0
- package/dist/esm/foundation/filterModel.d.ts +33 -0
- package/dist/esm/foundation/filterModel.d.ts.map +1 -0
- package/dist/esm/foundation/filterModel.js +112 -0
- package/dist/esm/foundation/filterModel.js.map +1 -0
- package/dist/esm/foundation/formatting.d.ts +13 -0
- package/dist/esm/foundation/formatting.d.ts.map +1 -0
- package/dist/esm/foundation/formatting.js +78 -0
- package/dist/esm/foundation/formatting.js.map +1 -0
- package/dist/esm/foundation/foundationComponentMetadata.d.ts +3 -0
- package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -0
- package/dist/esm/foundation/foundationComponentMetadata.js +67 -0
- package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -0
- package/dist/esm/foundation/foundationDescriptors.d.ts +6 -0
- package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -0
- package/dist/esm/foundation/foundationDescriptors.js +380 -0
- package/dist/esm/foundation/foundationDescriptors.js.map +1 -0
- package/dist/esm/foundation/foundationSamples.d.ts +10 -0
- package/dist/esm/foundation/foundationSamples.d.ts.map +1 -0
- package/dist/esm/foundation/foundationSamples.js +198 -0
- package/dist/esm/foundation/foundationSamples.js.map +1 -0
- package/dist/esm/foundation/foundationStrings.d.ts +103 -0
- package/dist/esm/foundation/foundationStrings.d.ts.map +1 -0
- package/dist/esm/foundation/foundationStrings.js +126 -0
- package/dist/esm/foundation/foundationStrings.js.map +1 -0
- package/dist/esm/foundation/index.d.ts +25 -0
- package/dist/esm/foundation/index.d.ts.map +1 -0
- package/dist/esm/foundation/index.js +25 -0
- package/dist/esm/foundation/index.js.map +1 -0
- package/dist/esm/foundation/useElementWidth.d.ts +3 -0
- package/dist/esm/foundation/useElementWidth.d.ts.map +1 -0
- package/dist/esm/foundation/useElementWidth.js +29 -0
- package/dist/esm/foundation/useElementWidth.js.map +1 -0
- package/dist/esm/foundation/viewModel.d.ts +7 -0
- package/dist/esm/foundation/viewModel.d.ts.map +1 -0
- package/dist/esm/foundation/viewModel.js +22 -0
- package/dist/esm/foundation/viewModel.js.map +1 -0
- package/dist/esm/gallery/widgets.js +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +24 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/themes/dark.d.ts.map +1 -1
- package/dist/esm/themes/dark.js +9 -1
- package/dist/esm/themes/dark.js.map +1 -1
- package/dist/esm/themes/light.d.ts.map +1 -1
- package/dist/esm/themes/light.js +10 -2
- package/dist/esm/themes/light.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/foundation/ActionButton.tsx +39 -0
- package/foundation/ChartWrapper.tsx +252 -0
- package/foundation/ColumnChooser.tsx +73 -0
- package/foundation/ComponentState.ts +53 -0
- package/foundation/EmptyState.tsx +22 -0
- package/foundation/FilterBuilder.tsx +144 -0
- package/foundation/Foundation.stories.tsx +46 -0
- package/foundation/FoundationIcon.tsx +49 -0
- package/foundation/FoundationStates.tsx +46 -0
- package/foundation/PermissionRule.ts +26 -0
- package/foundation/SavedViewsMenu.tsx +94 -0
- package/foundation/StatCard.tsx +44 -0
- package/foundation/StateFrame.tsx +126 -0
- package/foundation/StatusChip.tsx +51 -0
- package/foundation/TrendChip.tsx +78 -0
- package/foundation/chartGeometry.ts +108 -0
- package/foundation/columnModel.ts +39 -0
- package/foundation/filterModel.ts +111 -0
- package/foundation/formatting.ts +69 -0
- package/foundation/foundationComponentMetadata.ts +21 -0
- package/foundation/foundationDescriptors.ts +204 -0
- package/foundation/foundationSamples.ts +63 -0
- package/foundation/foundationStrings.ts +137 -0
- package/foundation/index.ts +27 -0
- package/foundation/useElementWidth.ts +31 -0
- package/foundation/viewModel.ts +21 -0
- package/index.ts +1 -0
- package/package.json +9 -8
- package/shell/layout.css +526 -0
- package/themes/dark.ts +8 -0
- package/themes/light.ts +9 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
6
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
7
|
+
const paths = {
|
|
8
|
+
check: 'M5 13l4 4L19 7',
|
|
9
|
+
close: 'M6 6l12 12M18 6L6 18',
|
|
10
|
+
'arrow-up': 'M12 19V5M5 12l7-7 7 7',
|
|
11
|
+
'arrow-down': 'M12 5v14M5 12l7 7 7-7',
|
|
12
|
+
minus: 'M5 12h14',
|
|
13
|
+
alert: 'M12 8v5M12 16.5v.5M10.3 3.9L2.5 17.5A2 2 0 004.2 20.5h15.6a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z',
|
|
14
|
+
info: 'M12 11v6M12 7.5v.5M12 21a9 9 0 100-18 9 9 0 000 18z',
|
|
15
|
+
lock: 'M7 11V8a5 5 0 0110 0v3M6 11h12a1 1 0 011 1v8a1 1 0 01-1 1H6a1 1 0 01-1-1v-8a1 1 0 011-1z',
|
|
16
|
+
clock: 'M12 7v5l3 2M12 21a9 9 0 100-18 9 9 0 000 18z',
|
|
17
|
+
inbox: 'M3 13l3-8h12l3 8M3 13v6a1 1 0 001 1h16a1 1 0 001-1v-6M3 13h5l1 3h6l1-3h5',
|
|
18
|
+
refresh: 'M20 11a8 8 0 10-2.3 6.3M20 4v7h-7',
|
|
19
|
+
plus: 'M12 5v14M5 12h14',
|
|
20
|
+
'chevron-right': 'M9 5l7 7-7 7',
|
|
21
|
+
'chevron-down': 'M5 9l7 7 7-7',
|
|
22
|
+
upload: 'M12 16V4M7 9l5-5 5 5M4 17v2a1 1 0 001 1h14a1 1 0 001-1v-2',
|
|
23
|
+
file: 'M14 3H7a1 1 0 00-1 1v16a1 1 0 001 1h10a1 1 0 001-1V7l-4-4zM14 3v4h4',
|
|
24
|
+
user: 'M12 12a4 4 0 100-8 4 4 0 000 8zM4 21a8 8 0 0116 0',
|
|
25
|
+
columns: 'M4 5h16v14H4zM9.5 5v14M14.5 5v14',
|
|
26
|
+
filter: 'M4 5h16l-6 8v6l-4-2v-4L4 5z',
|
|
27
|
+
star: 'M12 3l2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1L3.2 9.5l6.1-.9L12 3z',
|
|
28
|
+
circle: 'M12 20a8 8 0 100-16 8 8 0 000 16z'
|
|
29
|
+
};
|
|
30
|
+
/** Whether a name is one of the icons drawn here. */ function isFoundationIcon(name) {
|
|
31
|
+
return name in paths;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One icon. It is decorative unless given a label: the meaning an icon carries is always repeated in text, so no status is
|
|
35
|
+
* conveyed by color or shape alone (WCAG 1.4.1).
|
|
36
|
+
*/ function FoundationIcon({ name, label }) {
|
|
37
|
+
return /*#__PURE__*/ jsxRuntime.jsx("svg", {
|
|
38
|
+
className: "foundation-icon",
|
|
39
|
+
viewBox: "0 0 24 24",
|
|
40
|
+
width: "1em",
|
|
41
|
+
height: "1em",
|
|
42
|
+
fill: "none",
|
|
43
|
+
stroke: "currentColor",
|
|
44
|
+
strokeWidth: "2",
|
|
45
|
+
strokeLinecap: "round",
|
|
46
|
+
strokeLinejoin: "round",
|
|
47
|
+
"aria-hidden": label ? undefined : true,
|
|
48
|
+
role: label ? 'img' : undefined,
|
|
49
|
+
"aria-label": label,
|
|
50
|
+
children: /*#__PURE__*/ jsxRuntime.jsx("path", {
|
|
51
|
+
d: paths[name]
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
exports.FoundationIcon = FoundationIcon;
|
|
57
|
+
exports.isFoundationIcon = isFoundationIcon;
|
|
58
|
+
//# sourceMappingURL=FoundationIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FoundationIcon.js","sources":["../../../foundation/FoundationIcon.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\n/** The icons the foundation components draw themselves, so none of them depends on an icon font being loaded. */\nexport type FoundationIconName =\n | 'check' | 'close' | 'arrow-up' | 'arrow-down' | 'minus' | 'alert' | 'info' | 'lock' | 'clock' | 'inbox' | 'refresh'\n | 'plus' | 'chevron-right' | 'chevron-down' | 'upload' | 'file' | 'user' | 'columns' | 'filter' | 'star' | 'circle';\n\nconst paths: Record<FoundationIconName, string> = {\n check: 'M5 13l4 4L19 7',\n close: 'M6 6l12 12M18 6L6 18',\n 'arrow-up': 'M12 19V5M5 12l7-7 7 7',\n 'arrow-down': 'M12 5v14M5 12l7 7 7-7',\n minus: 'M5 12h14',\n alert: 'M12 8v5M12 16.5v.5M10.3 3.9L2.5 17.5A2 2 0 004.2 20.5h15.6a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z',\n info: 'M12 11v6M12 7.5v.5M12 21a9 9 0 100-18 9 9 0 000 18z',\n lock: 'M7 11V8a5 5 0 0110 0v3M6 11h12a1 1 0 011 1v8a1 1 0 01-1 1H6a1 1 0 01-1-1v-8a1 1 0 011-1z',\n clock: 'M12 7v5l3 2M12 21a9 9 0 100-18 9 9 0 000 18z',\n inbox: 'M3 13l3-8h12l3 8M3 13v6a1 1 0 001 1h16a1 1 0 001-1v-6M3 13h5l1 3h6l1-3h5',\n refresh: 'M20 11a8 8 0 10-2.3 6.3M20 4v7h-7',\n plus: 'M12 5v14M5 12h14',\n 'chevron-right': 'M9 5l7 7-7 7',\n 'chevron-down': 'M5 9l7 7 7-7',\n upload: 'M12 16V4M7 9l5-5 5 5M4 17v2a1 1 0 001 1h14a1 1 0 001-1v-2',\n file: 'M14 3H7a1 1 0 00-1 1v16a1 1 0 001 1h10a1 1 0 001-1V7l-4-4zM14 3v4h4',\n user: 'M12 12a4 4 0 100-8 4 4 0 000 8zM4 21a8 8 0 0116 0',\n columns: 'M4 5h16v14H4zM9.5 5v14M14.5 5v14',\n filter: 'M4 5h16l-6 8v6l-4-2v-4L4 5z',\n star: 'M12 3l2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1L3.2 9.5l6.1-.9L12 3z',\n circle: 'M12 20a8 8 0 100-16 8 8 0 000 16z',\n};\n\n/** Whether a name is one of the icons drawn here. */\nexport function isFoundationIcon(name: string): name is FoundationIconName {\n return name in paths;\n}\n\n/**\n * One icon. It is decorative unless given a label: the meaning an icon carries is always repeated in text, so no status is\n * conveyed by color or shape alone (WCAG 1.4.1).\n */\nexport function FoundationIcon({ name, label }: { name: FoundationIconName; label?: string }) {\n return (\n <svg className='foundation-icon' viewBox='0 0 24 24' width='1em' height='1em' fill='none' stroke='currentColor' strokeWidth='2'\n strokeLinecap='round' strokeLinejoin='round' aria-hidden={label ? undefined : true} role={label ? 'img' : undefined} aria-label={label}>\n <path d={paths[name]} />\n </svg>\n );\n}\n"],"names":["paths","check","close","minus","alert","info","lock","clock","inbox","refresh","plus","upload","file","user","columns","filter","star","circle","isFoundationIcon","name","FoundationIcon","label","_jsx","svg","className","viewBox","width","height","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","aria-hidden","undefined","role","aria-label","path","d"],"mappings":";;;;AAAA;AACA;AAOA,MAAMA,KAAAA,GAA4C;IAC9CC,KAAAA,EAAO,gBAAA;IACPC,KAAAA,EAAO,sBAAA;IACP,UAAA,EAAY,uBAAA;IACZ,YAAA,EAAc,uBAAA;IACdC,KAAAA,EAAO,UAAA;IACPC,KAAAA,EAAO,mGAAA;IACPC,IAAAA,EAAM,qDAAA;IACNC,IAAAA,EAAM,0FAAA;IACNC,KAAAA,EAAO,8CAAA;IACPC,KAAAA,EAAO,0EAAA;IACPC,OAAAA,EAAS,mCAAA;IACTC,IAAAA,EAAM,kBAAA;IACN,eAAA,EAAiB,cAAA;IACjB,cAAA,EAAgB,cAAA;IAChBC,MAAAA,EAAQ,2DAAA;IACRC,IAAAA,EAAM,qEAAA;IACNC,IAAAA,EAAM,mDAAA;IACNC,OAAAA,EAAS,kCAAA;IACTC,MAAAA,EAAQ,6BAAA;IACRC,IAAAA,EAAM,6EAAA;IACNC,MAAAA,EAAQ;AACZ,CAAA;AAEA,sDACO,SAASC,gBAAAA,CAAiBC,IAAY,EAAA;AACzC,IAAA,OAAOA,IAAAA,IAAQnB,KAAAA;AACnB;AAEA;;;AAGC,IACM,SAASoB,cAAAA,CAAe,EAAED,IAAI,EAAEE,KAAK,EAAgD,EAAA;AACxF,IAAA,qBACIC,cAAA,CAACC,KAAAA,EAAAA;QAAIC,SAAAA,EAAU,iBAAA;QAAkBC,OAAAA,EAAQ,WAAA;QAAYC,KAAAA,EAAM,KAAA;QAAMC,MAAAA,EAAO,KAAA;QAAMC,IAAAA,EAAK,MAAA;QAAOC,MAAAA,EAAO,cAAA;QAAeC,WAAAA,EAAY,GAAA;QACxHC,aAAAA,EAAc,OAAA;QAAQC,cAAAA,EAAe,OAAA;AAAQC,QAAAA,aAAAA,EAAaZ,QAAQa,SAAAA,GAAY,IAAA;AAAMC,QAAAA,IAAAA,EAAMd,QAAQ,KAAA,GAAQa,SAAAA;QAAWE,YAAAA,EAAYf,KAAAA;AACjI,QAAA,QAAA,gBAAAC,cAAA,CAACe,MAAAA,EAAAA;YAAKC,CAAAA,EAAGtC,KAAK,CAACmB,IAAAA;;;AAG3B;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var scene_react = require('@cratis/scene.react');
|
|
5
|
+
var defaultBlueprintComponents = require('../defaultBlueprintComponents.js');
|
|
6
|
+
var packageName = require('../packageName.js');
|
|
7
|
+
var light = require('../themes/light.js');
|
|
8
|
+
var dark = require('../themes/dark.js');
|
|
9
|
+
require('react');
|
|
10
|
+
var ComponentState = require('./ComponentState.js');
|
|
11
|
+
var foundationSamples = require('./foundationSamples.js');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Every standard state of one foundation component side by side in one theme: the preview of spec Part B 6 ("all standard states
|
|
15
|
+
* implemented and previewable"), used by the stories and by the gallery.
|
|
16
|
+
*/ function FoundationStates({ component, theme, properties, rightToLeft }) {
|
|
17
|
+
const Component = defaultBlueprintComponents.defaultBlueprintComponents[scene_react.componentRegistryKey(packageName.defaultBlueprintName, component)];
|
|
18
|
+
const sample = foundationSamples.foundationSamples[component];
|
|
19
|
+
const states = sample?.stateful ? ComponentState.componentStates : [
|
|
20
|
+
ComponentState.ComponentState.Ready
|
|
21
|
+
];
|
|
22
|
+
return /*#__PURE__*/ jsxRuntime.jsx(scene_react.SceneThemeProvider, {
|
|
23
|
+
theme: theme === 'dark' ? dark.darkTheme : light.lightTheme,
|
|
24
|
+
children: /*#__PURE__*/ jsxRuntime.jsx("div", {
|
|
25
|
+
dir: rightToLeft ? 'rtl' : 'ltr',
|
|
26
|
+
className: "foundation-states",
|
|
27
|
+
style: {
|
|
28
|
+
display: 'grid',
|
|
29
|
+
gap: '1rem',
|
|
30
|
+
padding: '1rem',
|
|
31
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(18rem, 1fr))',
|
|
32
|
+
background: 'var(--scene-surface-background)',
|
|
33
|
+
color: 'var(--scene-text-color)'
|
|
34
|
+
},
|
|
35
|
+
children: states.map((state)=>/*#__PURE__*/ jsxRuntime.jsxs("figure", {
|
|
36
|
+
style: {
|
|
37
|
+
margin: 0
|
|
38
|
+
},
|
|
39
|
+
children: [
|
|
40
|
+
/*#__PURE__*/ jsxRuntime.jsx("figcaption", {
|
|
41
|
+
style: {
|
|
42
|
+
fontSize: '0.75rem',
|
|
43
|
+
textTransform: 'uppercase',
|
|
44
|
+
marginBlockEnd: '0.5rem'
|
|
45
|
+
},
|
|
46
|
+
children: state
|
|
47
|
+
}),
|
|
48
|
+
/*#__PURE__*/ jsxRuntime.jsx(Component, {
|
|
49
|
+
element: foundationSamples.foundationElement(component, {
|
|
50
|
+
...sample?.properties,
|
|
51
|
+
...properties
|
|
52
|
+
}, state === ComponentState.ComponentState.Ready ? undefined : state),
|
|
53
|
+
slots: {}
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
}, state))
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
exports.FoundationStates = FoundationStates;
|
|
62
|
+
//# sourceMappingURL=FoundationStates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FoundationStates.js","sources":["../../../foundation/FoundationStates.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 { componentRegistryKey, SceneThemeProvider } from '@cratis/scene.react';\nimport { defaultBlueprintComponents } from '../defaultBlueprintComponents';\nimport { defaultBlueprintName } from '../packageName';\nimport { darkTheme, lightTheme } from '../themes';\nimport { ComponentState, componentStates } from './ComponentState';\nimport { foundationElement, foundationSamples } from './foundationSamples';\n\nexport interface FoundationStatesProps {\n /** The bare name of the foundation component. */\n component: string;\n\n /** The theme the states are drawn in. */\n theme: 'light' | 'dark';\n\n /** Properties to lay over the sample, to show a variant. */\n properties?: Record<string, unknown>;\n\n /** Whether the page reads right to left. */\n rightToLeft?: boolean;\n}\n\n/**\n * Every standard state of one foundation component side by side in one theme: the preview of spec Part B 6 (\"all standard states\n * implemented and previewable\"), used by the stories and by the gallery.\n */\nexport function FoundationStates({ component, theme, properties, rightToLeft }: FoundationStatesProps) {\n const Component = defaultBlueprintComponents[componentRegistryKey(defaultBlueprintName, component)];\n const sample = foundationSamples[component];\n const states = sample?.stateful ? componentStates : [ComponentState.Ready];\n\n return (\n <SceneThemeProvider theme={theme === 'dark' ? darkTheme : lightTheme}>\n <div dir={rightToLeft ? 'rtl' : 'ltr'} className='foundation-states' style={{ display: 'grid', gap: '1rem', padding: '1rem', gridTemplateColumns: 'repeat(auto-fill, minmax(18rem, 1fr))', background: 'var(--scene-surface-background)', color: 'var(--scene-text-color)' }}>\n {states.map(state => (\n <figure key={state} style={{ margin: 0 }}>\n <figcaption style={{ fontSize: '0.75rem', textTransform: 'uppercase', marginBlockEnd: '0.5rem' }}>{state}</figcaption>\n <Component element={foundationElement(component, { ...sample?.properties, ...properties }, state === ComponentState.Ready ? undefined : state)} slots={{}} />\n </figure>\n ))}\n </div>\n </SceneThemeProvider>\n );\n}\n"],"names":["FoundationStates","component","theme","properties","rightToLeft","Component","defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","sample","foundationSamples","states","stateful","componentStates","ComponentState","Ready","_jsx","SceneThemeProvider","darkTheme","lightTheme","div","dir","className","style","display","gap","padding","gridTemplateColumns","background","color","map","state","_jsxs","figure","margin","figcaption","fontSize","textTransform","marginBlockEnd","element","foundationElement","undefined","slots"],"mappings":";;;;;;;;;;;;AAwBA;;;IAIO,SAASA,gBAAAA,CAAiB,EAAEC,SAAS,EAAEC,KAAK,EAAEC,UAAU,EAAEC,WAAW,EAAyB,EAAA;AACjG,IAAA,MAAMC,SAAAA,GAAYC,qDAA0B,CAACC,gCAAAA,CAAqBC,kCAAsBP,SAAAA,CAAAA,CAAW;IACnG,MAAMQ,MAAAA,GAASC,mCAAiB,CAACT,SAAAA,CAAU;IAC3C,MAAMU,MAAAA,GAASF,MAAAA,EAAQG,QAAAA,GAAWC,8BAAAA,GAAkB;AAACC,QAAAA,6BAAAA,CAAeC;AAAM,KAAA;AAE1E,IAAA,qBACIC,cAAA,CAACC,8BAAAA,EAAAA;QAAmBf,KAAAA,EAAOA,KAAAA,KAAU,SAASgB,cAAAA,GAAYC,gBAAAA;AACtD,QAAA,QAAA,gBAAAH,cAAA,CAACI,KAAAA,EAAAA;AAAIC,YAAAA,GAAAA,EAAKjB,cAAc,KAAA,GAAQ,KAAA;YAAOkB,SAAAA,EAAU,mBAAA;YAAoBC,KAAAA,EAAO;gBAAEC,OAAAA,EAAS,MAAA;gBAAQC,GAAAA,EAAK,MAAA;gBAAQC,OAAAA,EAAS,MAAA;gBAAQC,mBAAAA,EAAqB,uCAAA;gBAAyCC,UAAAA,EAAY,iCAAA;gBAAmCC,KAAAA,EAAO;AAA0B,aAAA;AACtQlB,YAAAA,QAAAA,EAAAA,MAAAA,CAAOmB,GAAG,CAACC,CAAAA,KAAAA,iBACRC,eAAA,CAACC,QAAAA,EAAAA;oBAAmBV,KAAAA,EAAO;wBAAEW,MAAAA,EAAQ;AAAE,qBAAA;;sCACnClB,cAAA,CAACmB,YAAAA,EAAAA;4BAAWZ,KAAAA,EAAO;gCAAEa,QAAAA,EAAU,SAAA;gCAAWC,aAAAA,EAAe,WAAA;gCAAaC,cAAAA,EAAgB;AAAS,6BAAA;AAAIP,4BAAAA,QAAAA,EAAAA;;sCACnGf,cAAA,CAACX,SAAAA,EAAAA;AAAUkC,4BAAAA,OAAAA,EAASC,oCAAkBvC,SAAAA,EAAW;AAAE,gCAAA,GAAGQ,QAAQN,UAAU;AAAE,gCAAA,GAAGA;AAAW,6BAAA,EAAG4B,KAAAA,KAAUjB,6BAAAA,CAAeC,KAAK,GAAG0B,SAAAA,GAAYV,KAAAA,CAAAA;AAAQW,4BAAAA,KAAAA,EAAO;;;AAF9IX,iBAAAA,EAAAA,KAAAA,CAAAA;;;AAQjC;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
/**
|
|
6
|
+
* What an action control does when the user lacks the permission it needs (spec Part B 1.5): it is shown and works, shown and
|
|
7
|
+
* refuses, or not shown. A template never assumes a role, so every action declares one of these and the host's permission
|
|
8
|
+
* evaluation sets it.
|
|
9
|
+
*/ var PermissionRule = /*#__PURE__*/ function(PermissionRule) {
|
|
10
|
+
/** The control works. */ PermissionRule["Enabled"] = "enabled";
|
|
11
|
+
/** The control is shown but cannot be used, and says why. */ PermissionRule["Disabled"] = "disabled";
|
|
12
|
+
/** The control is not rendered. */ PermissionRule["Hidden"] = "hidden";
|
|
13
|
+
return PermissionRule;
|
|
14
|
+
}({});
|
|
15
|
+
/** Reads a permission rule from a property, defaulting to Enabled for anything that is not a rule. */ function readPermissionRule(element, property = 'permission') {
|
|
16
|
+
const value = element.properties[property];
|
|
17
|
+
return value === "disabled" || value === "hidden" ? value : "enabled";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.PermissionRule = PermissionRule;
|
|
21
|
+
exports.readPermissionRule = readPermissionRule;
|
|
22
|
+
//# sourceMappingURL=PermissionRule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionRule.js","sources":["../../../foundation/PermissionRule.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 { ExternalComponent } from '@cratis/scene.model';\n\n/**\n * What an action control does when the user lacks the permission it needs (spec Part B 1.5): it is shown and works, shown and\n * refuses, or not shown. A template never assumes a role, so every action declares one of these and the host's permission\n * evaluation sets it.\n */\nexport enum PermissionRule {\n /** The control works. */\n Enabled = 'enabled',\n\n /** The control is shown but cannot be used, and says why. */\n Disabled = 'disabled',\n\n /** The control is not rendered. */\n Hidden = 'hidden',\n}\n\n/** Reads a permission rule from a property, defaulting to Enabled for anything that is not a rule. */\nexport function readPermissionRule(element: ExternalComponent, property = 'permission'): PermissionRule {\n const value = element.properties[property];\n return value === PermissionRule.Disabled || value === PermissionRule.Hidden ? value : PermissionRule.Enabled;\n}\n"],"names":["PermissionRule","readPermissionRule","element","property","value","properties"],"mappings":";;AAAA;AACA;AAIA;;;;IAKO,IAAKA,cAAAA,iBAAAA,SAAAA,cAAAA,EAAAA;8BACe,cAAA,CAAA,SAAA,CAAA,GAAA,SAAA;kEAGoC,cAAA,CAAA,UAAA,CAAA,GAAA,UAAA;wCAG1B,cAAA,CAAA,QAAA,CAAA,GAAA,QAAA;AAPzBA,IAAAA,OAAAA,cAAAA;AASX,CAAA,CAAA,EAAA;AAED,uGACO,SAASC,mBAAmBC,OAA0B,EAAEC,WAAW,YAAY,EAAA;AAClF,IAAA,MAAMC,KAAAA,GAAQF,OAAAA,CAAQG,UAAU,CAACF,QAAAA,CAAS;AAC1C,IAAA,OAAOC,wBAAqCA,KAAAA,KAAAA,QAAAA,GAAkCA,KAAAA,GAAAA,SAAAA;AAClF;;;"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var scene_react = require('@cratis/scene.react');
|
|
6
|
+
var ComponentState = require('./ComponentState.js');
|
|
7
|
+
var FoundationIcon = require('./FoundationIcon.js');
|
|
8
|
+
var foundationStrings = require('./foundationStrings.js');
|
|
9
|
+
var PermissionRule = require('./PermissionRule.js');
|
|
10
|
+
var StateFrame = require('./StateFrame.js');
|
|
11
|
+
var elementProperties = require('../shell/elementProperties.js');
|
|
12
|
+
var viewModel = require('./viewModel.js');
|
|
13
|
+
|
|
14
|
+
/** The output a menu action is published under: `save` or `manage`, which the host acts on. */ const savedViewActionOutput = 'action';
|
|
15
|
+
/**
|
|
16
|
+
* The `savedViewsMenu` component: a list's saved views as a menu button, with the current view as its label.
|
|
17
|
+
*
|
|
18
|
+
* `views` are the choices (id, label, description) and `activeView` the one in force. Choosing a view publishes its id as the `value`
|
|
19
|
+
* output and runs the behaviors attached to the element, so a screen binds its query to the view. The menu follows the ARIA menu
|
|
20
|
+
* pattern: arrows, Home and End move, Enter chooses, Escape closes and returns focus to the button. "Save current view" and
|
|
21
|
+
* "Manage views" publish `save` or `manage` on the `action` output, and each honours its own permission rule (`savePermission`,
|
|
22
|
+
* `managePermission`): hidden, or disabled with the reason.
|
|
23
|
+
*/ function SavedViewsMenu({ element, interactions, bindingOutputs }) {
|
|
24
|
+
const views = react.useMemo(()=>viewModel.readViews(element.properties.views), [
|
|
25
|
+
element.properties.views
|
|
26
|
+
]);
|
|
27
|
+
const suppliedActive = elementProperties.readOptionalString(element, 'activeView') ?? views[0]?.id;
|
|
28
|
+
const [active, setActive] = react.useState(suppliedActive);
|
|
29
|
+
const [open, setOpen] = react.useState(false);
|
|
30
|
+
const strings = foundationStrings.readFoundationStrings(element);
|
|
31
|
+
const state = ComponentState.readComponentState(element, views.length > 0);
|
|
32
|
+
const menuId = react.useId();
|
|
33
|
+
const button = react.useRef(null);
|
|
34
|
+
const menu = react.useRef(null);
|
|
35
|
+
const rules = {
|
|
36
|
+
save: PermissionRule.readPermissionRule(element, 'savePermission'),
|
|
37
|
+
manage: PermissionRule.readPermissionRule(element, 'managePermission')
|
|
38
|
+
};
|
|
39
|
+
react.useEffect(()=>setActive(suppliedActive), [
|
|
40
|
+
suppliedActive
|
|
41
|
+
]);
|
|
42
|
+
scene_react.useValueOutput(bindingOutputs, active);
|
|
43
|
+
react.useEffect(()=>{
|
|
44
|
+
if (open) menu.current?.querySelector('[role^="menuitem"]:not([aria-disabled="true"])')?.focus();
|
|
45
|
+
}, [
|
|
46
|
+
open
|
|
47
|
+
]);
|
|
48
|
+
const items = ()=>Array.from(menu.current?.querySelectorAll('[role^="menuitem"]:not([aria-disabled="true"])') ?? []);
|
|
49
|
+
const move = (event)=>{
|
|
50
|
+
const entries = items();
|
|
51
|
+
const index = entries.indexOf(document.activeElement);
|
|
52
|
+
const target = event.key === 'ArrowDown' ? (index + 1) % entries.length : event.key === 'ArrowUp' ? (index - 1 + entries.length) % entries.length : event.key === 'Home' ? 0 : event.key === 'End' ? entries.length - 1 : -1;
|
|
53
|
+
if (target >= 0) {
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
entries[target]?.focus();
|
|
56
|
+
}
|
|
57
|
+
if (event.key === 'Escape') {
|
|
58
|
+
setOpen(false);
|
|
59
|
+
button.current?.focus();
|
|
60
|
+
}
|
|
61
|
+
if (event.key === 'Tab') setOpen(false);
|
|
62
|
+
};
|
|
63
|
+
const choose = (id)=>{
|
|
64
|
+
setActive(id);
|
|
65
|
+
setOpen(false);
|
|
66
|
+
button.current?.focus();
|
|
67
|
+
interactions?.onSelect?.();
|
|
68
|
+
};
|
|
69
|
+
const run = (action)=>{
|
|
70
|
+
bindingOutputs?.setOutput(savedViewActionOutput, action);
|
|
71
|
+
setOpen(false);
|
|
72
|
+
button.current?.focus();
|
|
73
|
+
interactions?.onClick?.({
|
|
74
|
+
stopPropagation: ()=>undefined
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
const label = views.find((view)=>view.id === active)?.label ?? strings.viewsDefault;
|
|
78
|
+
return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
|
|
79
|
+
element: element,
|
|
80
|
+
interactions: interactions,
|
|
81
|
+
name: "saved-views",
|
|
82
|
+
state: state,
|
|
83
|
+
skeleton: [
|
|
84
|
+
45
|
|
85
|
+
],
|
|
86
|
+
children: state !== ComponentState.ComponentState.Loading && /*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
87
|
+
className: "foundation-popover-host",
|
|
88
|
+
children: [
|
|
89
|
+
/*#__PURE__*/ jsxRuntime.jsxs("button", {
|
|
90
|
+
ref: button,
|
|
91
|
+
type: "button",
|
|
92
|
+
className: "foundation-button",
|
|
93
|
+
"data-emphasis": "secondary",
|
|
94
|
+
"aria-haspopup": "menu",
|
|
95
|
+
"aria-expanded": open,
|
|
96
|
+
"aria-controls": menuId,
|
|
97
|
+
onClick: ()=>setOpen(!open),
|
|
98
|
+
onKeyDown: (event)=>{
|
|
99
|
+
if (event.key === 'ArrowDown' && !open) {
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
setOpen(true);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
children: [
|
|
105
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
106
|
+
className: "foundation-visually-hidden",
|
|
107
|
+
children: `${strings.viewsLabel}: `
|
|
108
|
+
}),
|
|
109
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
110
|
+
children: label
|
|
111
|
+
}),
|
|
112
|
+
/*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
|
|
113
|
+
name: "chevron-down"
|
|
114
|
+
})
|
|
115
|
+
]
|
|
116
|
+
}),
|
|
117
|
+
/*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
118
|
+
id: menuId,
|
|
119
|
+
ref: menu,
|
|
120
|
+
className: "foundation-popover",
|
|
121
|
+
role: "menu",
|
|
122
|
+
"aria-label": strings.viewsLabel,
|
|
123
|
+
hidden: !open,
|
|
124
|
+
onKeyDown: move,
|
|
125
|
+
children: [
|
|
126
|
+
views.length === 0 && /*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
127
|
+
className: "foundation-count",
|
|
128
|
+
children: strings.viewsNone
|
|
129
|
+
}),
|
|
130
|
+
views.map((view)=>/*#__PURE__*/ jsxRuntime.jsxs("button", {
|
|
131
|
+
type: "button",
|
|
132
|
+
role: "menuitemradio",
|
|
133
|
+
"aria-checked": view.id === active,
|
|
134
|
+
className: "foundation-menu-item",
|
|
135
|
+
tabIndex: -1,
|
|
136
|
+
onClick: ()=>choose(view.id),
|
|
137
|
+
children: [
|
|
138
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
139
|
+
className: "foundation-menu-check",
|
|
140
|
+
children: view.id === active && /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
|
|
141
|
+
name: "check"
|
|
142
|
+
})
|
|
143
|
+
}),
|
|
144
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
145
|
+
children: view.label
|
|
146
|
+
}),
|
|
147
|
+
view.description && /*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
148
|
+
className: "foundation-count",
|
|
149
|
+
children: view.description
|
|
150
|
+
})
|
|
151
|
+
]
|
|
152
|
+
}, view.id)),
|
|
153
|
+
(rules.save !== PermissionRule.PermissionRule.Hidden || rules.manage !== PermissionRule.PermissionRule.Hidden) && /*#__PURE__*/ jsxRuntime.jsx("hr", {
|
|
154
|
+
className: "foundation-separator"
|
|
155
|
+
}),
|
|
156
|
+
rules.save !== PermissionRule.PermissionRule.Hidden && /*#__PURE__*/ jsxRuntime.jsxs("button", {
|
|
157
|
+
type: "button",
|
|
158
|
+
role: "menuitem",
|
|
159
|
+
className: "foundation-menu-item",
|
|
160
|
+
tabIndex: -1,
|
|
161
|
+
"aria-disabled": rules.save === PermissionRule.PermissionRule.Disabled || undefined,
|
|
162
|
+
title: rules.save === PermissionRule.PermissionRule.Disabled ? strings.disabledNoPermission : undefined,
|
|
163
|
+
onClick: rules.save === PermissionRule.PermissionRule.Enabled ? ()=>run('save') : undefined,
|
|
164
|
+
children: [
|
|
165
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
166
|
+
className: "foundation-menu-check"
|
|
167
|
+
}),
|
|
168
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
169
|
+
children: strings.viewsSave
|
|
170
|
+
})
|
|
171
|
+
]
|
|
172
|
+
}),
|
|
173
|
+
rules.manage !== PermissionRule.PermissionRule.Hidden && /*#__PURE__*/ jsxRuntime.jsxs("button", {
|
|
174
|
+
type: "button",
|
|
175
|
+
role: "menuitem",
|
|
176
|
+
className: "foundation-menu-item",
|
|
177
|
+
tabIndex: -1,
|
|
178
|
+
"aria-disabled": rules.manage === PermissionRule.PermissionRule.Disabled || undefined,
|
|
179
|
+
title: rules.manage === PermissionRule.PermissionRule.Disabled ? strings.disabledNoPermission : undefined,
|
|
180
|
+
onClick: rules.manage === PermissionRule.PermissionRule.Enabled ? ()=>run('manage') : undefined,
|
|
181
|
+
children: [
|
|
182
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
183
|
+
className: "foundation-menu-check"
|
|
184
|
+
}),
|
|
185
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
186
|
+
children: strings.viewsManage
|
|
187
|
+
})
|
|
188
|
+
]
|
|
189
|
+
})
|
|
190
|
+
]
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
})
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
exports.SavedViewsMenu = SavedViewsMenu;
|
|
198
|
+
exports.savedViewActionOutput = savedViewActionOutput;
|
|
199
|
+
//# sourceMappingURL=SavedViewsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SavedViewsMenu.js","sources":["../../../foundation/SavedViewsMenu.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 { KeyboardEvent, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon } from './FoundationIcon';\nimport { readFoundationStrings } from './foundationStrings';\nimport { PermissionRule, readPermissionRule } from './PermissionRule';\nimport { FoundationFrame } from './StateFrame';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { readViews } from './viewModel';\n\n/** The output a menu action is published under: `save` or `manage`, which the host acts on. */\nexport const savedViewActionOutput = 'action';\n\n/**\n * The `savedViewsMenu` component: a list's saved views as a menu button, with the current view as its label.\n *\n * `views` are the choices (id, label, description) and `activeView` the one in force. Choosing a view publishes its id as the `value`\n * output and runs the behaviors attached to the element, so a screen binds its query to the view. The menu follows the ARIA menu\n * pattern: arrows, Home and End move, Enter chooses, Escape closes and returns focus to the button. \"Save current view\" and\n * \"Manage views\" publish `save` or `manage` on the `action` output, and each honours its own permission rule (`savePermission`,\n * `managePermission`): hidden, or disabled with the reason.\n */\nexport function SavedViewsMenu({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const views = useMemo(() => readViews(element.properties.views), [element.properties.views]);\n const suppliedActive = readOptionalString(element, 'activeView') ?? views[0]?.id;\n const [active, setActive] = useState<string | undefined>(suppliedActive);\n const [open, setOpen] = useState(false);\n const strings = readFoundationStrings(element);\n const state = readComponentState(element, views.length > 0);\n const menuId = useId();\n const button = useRef<HTMLButtonElement>(null);\n const menu = useRef<HTMLDivElement>(null);\n const rules = { save: readPermissionRule(element, 'savePermission'), manage: readPermissionRule(element, 'managePermission') };\n\n useEffect(() => setActive(suppliedActive), [suppliedActive]);\n useValueOutput(bindingOutputs, active);\n useEffect(() => { if (open) menu.current?.querySelector<HTMLElement>('[role^=\"menuitem\"]:not([aria-disabled=\"true\"])')?.focus(); }, [open]);\n\n const items = () => Array.from(menu.current?.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]:not([aria-disabled=\"true\"])') ?? []);\n const move = (event: KeyboardEvent) => {\n const entries = items();\n const index = entries.indexOf(document.activeElement as HTMLElement);\n const target = event.key === 'ArrowDown' ? (index + 1) % entries.length : event.key === 'ArrowUp' ? (index - 1 + entries.length) % entries.length\n : event.key === 'Home' ? 0 : event.key === 'End' ? entries.length - 1 : -1;\n\n if (target >= 0) { event.preventDefault(); entries[target]?.focus(); }\n if (event.key === 'Escape') { setOpen(false); button.current?.focus(); }\n if (event.key === 'Tab') setOpen(false);\n };\n const choose = (id: string) => { setActive(id); setOpen(false); button.current?.focus(); interactions?.onSelect?.(); };\n const run = (action: 'save' | 'manage') => { bindingOutputs?.setOutput(savedViewActionOutput, action); setOpen(false); button.current?.focus(); interactions?.onClick?.({ stopPropagation: () => undefined }); };\n const label = views.find(view => view.id === active)?.label ?? strings.viewsDefault;\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='saved-views' state={state} skeleton={[45]}>\n {state !== ComponentState.Loading && (\n <div className='foundation-popover-host'>\n <button ref={button} type='button' className='foundation-button' data-emphasis='secondary' aria-haspopup='menu' aria-expanded={open} aria-controls={menuId}\n onClick={() => setOpen(!open)} onKeyDown={event => { if (event.key === 'ArrowDown' && !open) { event.preventDefault(); setOpen(true); } }}>\n <span className='foundation-visually-hidden'>{`${strings.viewsLabel}: `}</span>\n <span>{label}</span>\n <FoundationIcon name='chevron-down' />\n </button>\n <div id={menuId} ref={menu} className='foundation-popover' role='menu' aria-label={strings.viewsLabel} hidden={!open} onKeyDown={move}>\n {views.length === 0 && <span className='foundation-count'>{strings.viewsNone}</span>}\n {views.map(view => (\n <button key={view.id} type='button' role='menuitemradio' aria-checked={view.id === active} className='foundation-menu-item' tabIndex={-1} onClick={() => choose(view.id)}>\n <span className='foundation-menu-check'>{view.id === active && <FoundationIcon name='check' />}</span>\n <span>{view.label}</span>\n {view.description && <span className='foundation-count'>{view.description}</span>}\n </button>\n ))}\n {(rules.save !== PermissionRule.Hidden || rules.manage !== PermissionRule.Hidden) && <hr className='foundation-separator' />}\n {rules.save !== PermissionRule.Hidden && (\n <button type='button' role='menuitem' className='foundation-menu-item' tabIndex={-1} aria-disabled={rules.save === PermissionRule.Disabled || undefined}\n title={rules.save === PermissionRule.Disabled ? strings.disabledNoPermission : undefined} onClick={rules.save === PermissionRule.Enabled ? () => run('save') : undefined}>\n <span className='foundation-menu-check' /><span>{strings.viewsSave}</span>\n </button>\n )}\n {rules.manage !== PermissionRule.Hidden && (\n <button type='button' role='menuitem' className='foundation-menu-item' tabIndex={-1} aria-disabled={rules.manage === PermissionRule.Disabled || undefined}\n title={rules.manage === PermissionRule.Disabled ? strings.disabledNoPermission : undefined} onClick={rules.manage === PermissionRule.Enabled ? () => run('manage') : undefined}>\n <span className='foundation-menu-check' /><span>{strings.viewsManage}</span>\n </button>\n )}\n </div>\n </div>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["savedViewActionOutput","SavedViewsMenu","element","interactions","bindingOutputs","views","useMemo","readViews","properties","suppliedActive","readOptionalString","id","active","setActive","useState","open","setOpen","strings","readFoundationStrings","state","readComponentState","length","menuId","useId","button","useRef","menu","rules","save","readPermissionRule","manage","useEffect","useValueOutput","current","querySelector","focus","items","Array","from","querySelectorAll","move","event","entries","index","indexOf","document","activeElement","target","key","preventDefault","choose","onSelect","run","action","setOutput","onClick","stopPropagation","undefined","label","find","view","viewsDefault","_jsx","FoundationFrame","name","skeleton","ComponentState","Loading","_jsxs","div","className","ref","type","data-emphasis","aria-haspopup","aria-expanded","aria-controls","onKeyDown","span","viewsLabel","FoundationIcon","role","aria-label","hidden","viewsNone","map","aria-checked","tabIndex","description","PermissionRule","Hidden","hr","aria-disabled","Disabled","title","disabledNoPermission","Enabled","viewsSave","viewsManage"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var ComponentState = require('./ComponentState.js');
|
|
5
|
+
var StateFrame = require('./StateFrame.js');
|
|
6
|
+
var TrendChip = require('./TrendChip.js');
|
|
7
|
+
var formatting = require('./formatting.js');
|
|
8
|
+
var foundationStrings = require('./foundationStrings.js');
|
|
9
|
+
var elementProperties = require('../shell/elementProperties.js');
|
|
10
|
+
|
|
11
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
12
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
13
|
+
/**
|
|
14
|
+
* The `statCard` component: one key figure with its label, its trend and what the trend is compared to - the unit of a dashboard's
|
|
15
|
+
* `kpis` slot.
|
|
16
|
+
*
|
|
17
|
+
* The value is a bound number, never embedded in the component (a figure is data, not design); it is formatted for the locale as
|
|
18
|
+
* a number, currency, percent or compact. With no value the card is empty, and it shows all five standard states
|
|
19
|
+
* independently of its neighbours, so a dashboard whose one query failed still shows the other cards.
|
|
20
|
+
*/ function StatCard({ element, interactions }) {
|
|
21
|
+
const value = element.properties.value;
|
|
22
|
+
const hasValue = typeof value === 'number';
|
|
23
|
+
const state = ComponentState.readComponentState(element, hasValue);
|
|
24
|
+
const locale = formatting.readLocale(element);
|
|
25
|
+
const label = elementProperties.readString(element, 'label');
|
|
26
|
+
const change = element.properties.change;
|
|
27
|
+
const currency = elementProperties.readOptionalString(element, 'currency');
|
|
28
|
+
return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
|
|
29
|
+
element: element,
|
|
30
|
+
interactions: interactions,
|
|
31
|
+
name: "stat-card",
|
|
32
|
+
state: state,
|
|
33
|
+
skeleton: [
|
|
34
|
+
40,
|
|
35
|
+
70,
|
|
36
|
+
30
|
|
37
|
+
],
|
|
38
|
+
children: state !== ComponentState.ComponentState.Loading && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
39
|
+
children: [
|
|
40
|
+
/*#__PURE__*/ jsxRuntime.jsx("h3", {
|
|
41
|
+
className: "foundation-stat-label",
|
|
42
|
+
children: label
|
|
43
|
+
}),
|
|
44
|
+
/*#__PURE__*/ jsxRuntime.jsx("p", {
|
|
45
|
+
className: "foundation-stat-value",
|
|
46
|
+
children: hasValue ? formatting.formatNumber(value, locale, formatting.readNumberFormat(element), currency, typeof element.properties.fractionDigits === 'number' ? element.properties.fractionDigits : undefined) : ''
|
|
47
|
+
}),
|
|
48
|
+
typeof change === 'number' && /*#__PURE__*/ jsxRuntime.jsx(TrendChip.TrendChipView, {
|
|
49
|
+
change: change,
|
|
50
|
+
locale: locale,
|
|
51
|
+
goodDirection: element.properties.goodDirection === 'down' ? 'down' : 'up',
|
|
52
|
+
comparison: elementProperties.readOptionalString(element, 'comparison'),
|
|
53
|
+
strings: foundationStrings.readFoundationStrings(element)
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
})
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
exports.StatCard = StatCard;
|
|
61
|
+
//# sourceMappingURL=StatCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatCard.js","sources":["../../../foundation/StatCard.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 { RegisteredComponentProps } from '@cratis/scene.react';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationFrame } from './StateFrame';\nimport { TrendChipView } from './TrendChip';\nimport { formatNumber, readLocale, readNumberFormat } from './formatting';\nimport { readFoundationStrings } from './foundationStrings';\nimport { readOptionalString, readString } from '../shell/elementProperties';\n\n/**\n * The `statCard` component: one key figure with its label, its trend and what the trend is compared to - the unit of a dashboard's\n * `kpis` slot.\n *\n * The value is a bound number, never embedded in the component (a figure is data, not design); it is formatted for the locale as\n * a number, currency, percent or compact. With no value the card is empty, and it shows all five standard states\n * independently of its neighbours, so a dashboard whose one query failed still shows the other cards.\n */\nexport function StatCard({ element, interactions }: RegisteredComponentProps) {\n const value = element.properties.value;\n const hasValue = typeof value === 'number';\n const state = readComponentState(element, hasValue);\n const locale = readLocale(element);\n const label = readString(element, 'label');\n const change = element.properties.change;\n const currency = readOptionalString(element, 'currency');\n\n return (\n <FoundationFrame element={element} interactions={interactions}\n name='stat-card' state={state} skeleton={[40, 70, 30]}>\n {state !== ComponentState.Loading && (\n <>\n <h3 className='foundation-stat-label'>{label}</h3>\n <p className='foundation-stat-value'>{hasValue ? formatNumber(value, locale, readNumberFormat(element), currency, typeof element.properties.fractionDigits === 'number' ? element.properties.fractionDigits : undefined) : ''}</p>\n {typeof change === 'number' && (\n <TrendChipView change={change} locale={locale} goodDirection={element.properties.goodDirection === 'down' ? 'down' : 'up'}\n comparison={readOptionalString(element, 'comparison')} strings={readFoundationStrings(element)} />\n )}\n </>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["StatCard","element","interactions","value","properties","hasValue","state","readComponentState","locale","readLocale","label","readString","change","currency","readOptionalString","_jsx","FoundationFrame","name","skeleton","ComponentState","Loading","_jsxs","_Fragment","h3","className","p","formatNumber","readNumberFormat","fractionDigits","undefined","TrendChipView","goodDirection","comparison","strings","readFoundationStrings"],"mappings":";;;;;;;;;;AAAA;AACA;AAUA;;;;;;;AAOC,IACM,SAASA,QAAAA,CAAS,EAAEC,OAAO,EAAEC,YAAY,EAA4B,EAAA;AACxE,IAAA,MAAMC,KAAAA,GAAQF,OAAAA,CAAQG,UAAU,CAACD,KAAK;IACtC,MAAME,QAAAA,GAAW,OAAOF,KAAAA,KAAU,QAAA;IAClC,MAAMG,KAAAA,GAAQC,kCAAmBN,OAAAA,EAASI,QAAAA,CAAAA;AAC1C,IAAA,MAAMG,SAASC,qBAAAA,CAAWR,OAAAA,CAAAA;IAC1B,MAAMS,KAAAA,GAAQC,6BAAWV,OAAAA,EAAS,OAAA,CAAA;AAClC,IAAA,MAAMW,MAAAA,GAASX,OAAAA,CAAQG,UAAU,CAACQ,MAAM;IACxC,MAAMC,QAAAA,GAAWC,qCAAmBb,OAAAA,EAAS,UAAA,CAAA;AAE7C,IAAA,qBACIc,cAAA,CAACC,0BAAAA,EAAAA;QAAgBf,OAAAA,EAASA,OAAAA;QAASC,YAAAA,EAAcA,YAAAA;QAC7Ce,IAAAA,EAAK,WAAA;QAAYX,KAAAA,EAAOA,KAAAA;QAAOY,QAAAA,EAAU;AAAC,YAAA,EAAA;AAAI,YAAA,EAAA;AAAI,YAAA;AAAG,SAAA;kBACpDZ,KAAAA,KAAUa,6BAAAA,CAAeC,OAAO,kBAC7BC,eAAA,CAAAC,mBAAA,EAAA;;8BACIP,cAAA,CAACQ,IAAAA,EAAAA;oBAAGC,SAAAA,EAAU,uBAAA;AAAyBd,oBAAAA,QAAAA,EAAAA;;8BACvCK,cAAA,CAACU,GAAAA,EAAAA;oBAAED,SAAAA,EAAU,uBAAA;AAAyBnB,oBAAAA,QAAAA,EAAAA,QAAAA,GAAWqB,wBAAavB,KAAAA,EAAOK,MAAAA,EAAQmB,4BAAiB1B,OAAAA,CAAAA,EAAUY,QAAAA,EAAU,OAAOZ,OAAAA,CAAQG,UAAU,CAACwB,cAAc,KAAK,QAAA,GAAW3B,OAAAA,CAAQG,UAAU,CAACwB,cAAc,GAAGC,SAAAA,CAAAA,GAAa;;gBAC1N,OAAOjB,MAAAA,KAAW,0BACfG,cAAA,CAACe,uBAAAA,EAAAA;oBAAclB,MAAAA,EAAQA,MAAAA;oBAAQJ,MAAAA,EAAQA,MAAAA;AAAQuB,oBAAAA,aAAAA,EAAe9B,QAAQG,UAAU,CAAC2B,aAAa,KAAK,SAAS,MAAA,GAAS,IAAA;AACjHC,oBAAAA,UAAAA,EAAYlB,qCAAmBb,OAAAA,EAAS,YAAA,CAAA;AAAegC,oBAAAA,OAAAA,EAASC,uCAAAA,CAAsBjC,OAAAA;;;;;AAMlH;;"}
|