@stll/workspace-ui 0.11.23 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -2
- package/dist/view-switcher.d.ts +2 -2
- package/dist/view-switcher.js +10 -11
- package/package.json +11 -15
- package/dist/view-switcher.logic.d.ts +0 -13
- package/dist/view-switcher.logic.js +0 -14
package/README.md
CHANGED
|
@@ -24,12 +24,12 @@ Use the explicit subpaths for focused modules:
|
|
|
24
24
|
```tsx
|
|
25
25
|
import { ConditionBuilder } from "@stll/workspace-ui/conditions";
|
|
26
26
|
import { FieldValue } from "@stll/workspace-ui/field-value";
|
|
27
|
-
import { SortChips } from "@stll/workspace-ui/sorts";
|
|
28
|
-
import { WorkspaceViewSwitcher } from "@stll/workspace-ui/view-switcher";
|
|
29
27
|
import {
|
|
30
28
|
ResponsiveActionToolbar,
|
|
31
29
|
ResponsiveActionToolbarItem,
|
|
32
30
|
} from "@stll/workspace-ui/responsive-action-toolbar";
|
|
31
|
+
import { SortChips } from "@stll/workspace-ui/sorts";
|
|
32
|
+
import { WorkspaceViewSwitcher } from "@stll/workspace-ui/view-switcher";
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
The package also exposes a root entry for code that uses several workspace
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,6 @@ import { SortChips, SortChipsLabels, SortChipsProps, SortDescriptor, SortablePro
|
|
|
12
12
|
import { TableSkeletonRows } from "./table-skeleton-rows.js";
|
|
13
13
|
import { CreateWorkspaceKanbanSchemaParams, KANBAN_EMPTY_GROUP_VISIBILITIES, KANBAN_SAVED_VIEW_STATE_VERSION, KanbanBoardPresentation, KanbanEmptyGroupVisibility, KanbanPresentedBand, KanbanPresentedLane, KanbanSavedAxisState, KanbanSavedGroupAxisState, KanbanSavedGroupReference, KanbanSavedSubgroupState, KanbanSavedViewState, KanbanSavedViewStateV1, ResolveWorkspaceKanbanViewParams, ResolvedWorkspaceKanbanView, WorkspaceKanbanBuiltInGroupLabel, WorkspaceKanbanGroupingChoice, WorkspaceKanbanGroupingPickerLabels, WorkspaceKanbanGroupingPickerProps, WorkspaceKanbanProperty, createWorkspaceKanbanSchema, getWorkspaceKanbanGroupingChoices, normalizeKanbanSavedViewState, presentKanbanBoard, resolveWorkspaceKanbanView } from "./kanban-view.js";
|
|
14
14
|
import { WorkspaceKanbanGroupingPicker } from "./kanban-grouping-picker.js";
|
|
15
|
-
import { WorkspaceViewDirection, WorkspaceViewDropPosition, reorderWorkspaceViewIds, toWorkspaceViewDropPosition } from "./view-switcher.logic.js";
|
|
16
15
|
import { WorkspaceViewSwitcher, WorkspaceViewSwitcherEditing, WorkspaceViewSwitcherItem, WorkspaceViewSwitcherProps, WorkspaceViewSwitcherReorder } from "./view-switcher.js";
|
|
17
16
|
import { WorkspaceFrame, WorkspaceFrameEndRail, WorkspaceFrameInspector, WorkspaceFrameNavigation, WorkspaceFrameNavigationItem, WorkspaceFrameProps, WorkspaceFrameTopBar } from "./workspace-frame.js";
|
|
18
|
-
export { type ApplyCalculationSelectionParams, CONDITION_OPERATORS, type CalculationFormatters, CalculationKindPicker, type CalculationKindPickerProps, type CalculationLabels, CalculationPicker, type CalculationPickerProps, type CalculationProperty, type CalculationResult, type CalculationSelection, CalculationSummary, type CalculationSummaryProps, type ColorVariants, ColumnCalculation, ConditionBuilder, type ConditionBuilderLabels, type ConditionCapabilities, type ConditionOperator, type CreateWorkspaceKanbanSchemaParams, FIELD_CONTENT_TYPES, type FieldContent, type FieldOption, type FieldOptionChoice, FieldValue, type FieldValueType, type FormatCalculationParams, type FormattedCalculation, type FormulaCellRenderCtx, type GenericProperty, IntFieldValue, KANBAN_EMPTY_GROUP_VISIBILITIES, KANBAN_SAVED_VIEW_STATE_VERSION, type KanbanBoardPresentation, type KanbanEmptyGroupVisibility, type KanbanPresentedBand, type KanbanPresentedLane, type KanbanSavedAxisState, type KanbanSavedGroupAxisState, type KanbanSavedGroupReference, type KanbanSavedSubgroupState, type KanbanSavedViewState, type KanbanSavedViewStateV1, MoneyFieldValue, type OptionColor, PersonFieldValue, PropertyIcon, type PropertyIconType, type ResolveWorkspaceKanbanViewParams, type ResolvedWorkspaceKanbanView, SortChips, type SortChipsLabels, type SortChipsProps, type SortDescriptor, type SortableProperty, TableSkeletonRows, type UseCalculationParams, type ValueEditorKind, type ValueEditorRenderCtx, type WorkspaceCalculationLabels, type WorkspaceFieldContent, WorkspaceFrame, type WorkspaceFrameEndRail, type WorkspaceFrameInspector, type WorkspaceFrameNavigation, type WorkspaceFrameNavigationItem, type WorkspaceFrameProps, type WorkspaceFrameTopBar, type WorkspaceKanbanBuiltInGroupLabel, type WorkspaceKanbanGroupingChoice, WorkspaceKanbanGroupingPicker, type WorkspaceKanbanGroupingPickerLabels, type WorkspaceKanbanGroupingPickerProps, type WorkspaceKanbanProperty,
|
|
17
|
+
export { type ApplyCalculationSelectionParams, CONDITION_OPERATORS, type CalculationFormatters, CalculationKindPicker, type CalculationKindPickerProps, type CalculationLabels, CalculationPicker, type CalculationPickerProps, type CalculationProperty, type CalculationResult, type CalculationSelection, CalculationSummary, type CalculationSummaryProps, type ColorVariants, ColumnCalculation, ConditionBuilder, type ConditionBuilderLabels, type ConditionCapabilities, type ConditionOperator, type CreateWorkspaceKanbanSchemaParams, FIELD_CONTENT_TYPES, type FieldContent, type FieldOption, type FieldOptionChoice, FieldValue, type FieldValueType, type FormatCalculationParams, type FormattedCalculation, type FormulaCellRenderCtx, type GenericProperty, IntFieldValue, KANBAN_EMPTY_GROUP_VISIBILITIES, KANBAN_SAVED_VIEW_STATE_VERSION, type KanbanBoardPresentation, type KanbanEmptyGroupVisibility, type KanbanPresentedBand, type KanbanPresentedLane, type KanbanSavedAxisState, type KanbanSavedGroupAxisState, type KanbanSavedGroupReference, type KanbanSavedSubgroupState, type KanbanSavedViewState, type KanbanSavedViewStateV1, MoneyFieldValue, type OptionColor, PersonFieldValue, PropertyIcon, type PropertyIconType, type ResolveWorkspaceKanbanViewParams, type ResolvedWorkspaceKanbanView, SortChips, type SortChipsLabels, type SortChipsProps, type SortDescriptor, type SortableProperty, TableSkeletonRows, type UseCalculationParams, type ValueEditorKind, type ValueEditorRenderCtx, type WorkspaceCalculationLabels, type WorkspaceFieldContent, WorkspaceFrame, type WorkspaceFrameEndRail, type WorkspaceFrameInspector, type WorkspaceFrameNavigation, type WorkspaceFrameNavigationItem, type WorkspaceFrameProps, type WorkspaceFrameTopBar, type WorkspaceKanbanBuiltInGroupLabel, type WorkspaceKanbanGroupingChoice, WorkspaceKanbanGroupingPicker, type WorkspaceKanbanGroupingPickerLabels, type WorkspaceKanbanGroupingPickerProps, type WorkspaceKanbanProperty, WorkspaceViewSwitcher, type WorkspaceViewSwitcherEditing, type WorkspaceViewSwitcherItem, type WorkspaceViewSwitcherProps, type WorkspaceViewSwitcherReorder, appendChild, applyCalculationSelection, asGroup, buildLeaf, createWorkspaceKanbanSchema, emptyColor, fieldForNode, formatCalculationResult, getClipFieldValueLabel, getWorkspaceKanbanGroupingChoices, isConditionOperator, isMultiValue, leafFromField, leafOperand, leafOperator, leafValueList, leafValueString, normalizeKanbanSavedViewState, operandsEqual, operatorsFor, optionColors, presentKanbanBoard, removeChild, replaceChild, resolveOptionColor, resolveWorkspaceKanbanView, sortDirectionHint, useCalculation, valueEditorFor };
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,6 @@ import { TableSkeletonRows } from "./table-skeleton-rows.js";
|
|
|
12
12
|
import { FIELD_CONTENT_TYPES } from "./types.js";
|
|
13
13
|
import { KANBAN_EMPTY_GROUP_VISIBILITIES, KANBAN_SAVED_VIEW_STATE_VERSION, createWorkspaceKanbanSchema, getWorkspaceKanbanGroupingChoices, normalizeKanbanSavedViewState, presentKanbanBoard, resolveWorkspaceKanbanView } from "./kanban-view.js";
|
|
14
14
|
import { WorkspaceKanbanGroupingPicker } from "./kanban-grouping-picker.js";
|
|
15
|
-
import { reorderWorkspaceViewIds, toWorkspaceViewDropPosition } from "./view-switcher.logic.js";
|
|
16
15
|
import { WorkspaceViewSwitcher } from "./view-switcher.js";
|
|
17
16
|
import { WorkspaceFrame } from "./workspace-frame.js";
|
|
18
|
-
export { CONDITION_OPERATORS, CalculationKindPicker, CalculationPicker, CalculationSummary, ColumnCalculation, ConditionBuilder, FIELD_CONTENT_TYPES, FieldValue, IntFieldValue, KANBAN_EMPTY_GROUP_VISIBILITIES, KANBAN_SAVED_VIEW_STATE_VERSION, MoneyFieldValue, PersonFieldValue, PropertyIcon, SortChips, TableSkeletonRows, WorkspaceFrame, WorkspaceKanbanGroupingPicker, WorkspaceViewSwitcher, appendChild, applyCalculationSelection, asGroup, buildLeaf, createWorkspaceKanbanSchema, emptyColor, fieldForNode, formatCalculationResult, getClipFieldValueLabel, getWorkspaceKanbanGroupingChoices, isConditionOperator, isMultiValue, leafFromField, leafOperand, leafOperator, leafValueList, leafValueString, normalizeKanbanSavedViewState, operandsEqual, operatorsFor, optionColors, presentKanbanBoard, removeChild,
|
|
17
|
+
export { CONDITION_OPERATORS, CalculationKindPicker, CalculationPicker, CalculationSummary, ColumnCalculation, ConditionBuilder, FIELD_CONTENT_TYPES, FieldValue, IntFieldValue, KANBAN_EMPTY_GROUP_VISIBILITIES, KANBAN_SAVED_VIEW_STATE_VERSION, MoneyFieldValue, PersonFieldValue, PropertyIcon, SortChips, TableSkeletonRows, WorkspaceFrame, WorkspaceKanbanGroupingPicker, WorkspaceViewSwitcher, appendChild, applyCalculationSelection, asGroup, buildLeaf, createWorkspaceKanbanSchema, emptyColor, fieldForNode, formatCalculationResult, getClipFieldValueLabel, getWorkspaceKanbanGroupingChoices, isConditionOperator, isMultiValue, leafFromField, leafOperand, leafOperator, leafValueList, leafValueString, normalizeKanbanSavedViewState, operandsEqual, operatorsFor, optionColors, presentKanbanBoard, removeChild, replaceChild, resolveOptionColor, resolveWorkspaceKanbanView, sortDirectionHint, useCalculation, valueEditorFor };
|
package/dist/view-switcher.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { InlineDirection } from "@stll/ui/inline-reorder";
|
|
2
2
|
//#region src/view-switcher.d.ts
|
|
3
3
|
export type WorkspaceViewSwitcherItem = {
|
|
4
4
|
id: string;
|
|
@@ -17,7 +17,7 @@ export type WorkspaceViewSwitcherReorder<View> = {
|
|
|
17
17
|
export type WorkspaceViewSwitcherProps<View extends WorkspaceViewSwitcherItem> = {
|
|
18
18
|
activeViewId: string;
|
|
19
19
|
ariaLabel: string;
|
|
20
|
-
direction:
|
|
20
|
+
direction: InlineDirection;
|
|
21
21
|
reorder: WorkspaceViewSwitcherReorder<View> | null;
|
|
22
22
|
views: readonly View[];
|
|
23
23
|
addControl?: React.ReactNode;
|
package/dist/view-switcher.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { reorderWorkspaceViewIds, toWorkspaceViewDropPosition } from "./view-switcher.logic.js";
|
|
3
2
|
import { Button } from "@stll/ui/button";
|
|
4
3
|
import { EllipsisVerticalIcon } from "@stll/ui/icons";
|
|
5
4
|
import { Menu, MenuPopup, MenuTrigger } from "@stll/ui/menu";
|
|
6
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
import { cn } from "@stll/ui/utils";
|
|
8
7
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
9
|
-
import { attachClosestEdge
|
|
10
|
-
import {
|
|
11
|
-
import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element
|
|
8
|
+
import { attachClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge/attach-closest-edge";
|
|
9
|
+
import { extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge/extract-closest-edge";
|
|
10
|
+
import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/adapter/element-adapter";
|
|
11
|
+
import { combine } from "@atlaskit/pragmatic-drag-and-drop/utils/combine";
|
|
12
|
+
import { InlineDropIndicator } from "@stll/ui/inline-drop-indicator";
|
|
13
|
+
import { reorderInlineIds, toInlineDropPosition } from "@stll/ui/inline-reorder";
|
|
12
14
|
import { TOOLBAR_ROW_HEIGHT } from "@stll/ui/inspector";
|
|
13
15
|
import { Tabs, TabsList, TabsTab } from "@stll/ui/tabs";
|
|
14
16
|
//#region src/view-switcher.tsx
|
|
@@ -64,7 +66,7 @@ const WorkspaceViewSwitcher = ({ activeViewId, ariaLabel, direction, reorder, vi
|
|
|
64
66
|
stripContainer
|
|
65
67
|
]);
|
|
66
68
|
const handleReorder = (draggedId, targetId, position) => {
|
|
67
|
-
const reordered =
|
|
69
|
+
const reordered = reorderInlineIds({
|
|
68
70
|
ids: views.map((view) => view.id),
|
|
69
71
|
draggedId,
|
|
70
72
|
targetId,
|
|
@@ -151,12 +153,12 @@ const WorkspaceViewTab = ({ actions, canReorder, direction, getDragData, getDrop
|
|
|
151
153
|
allowedEdges: ["left", "right"]
|
|
152
154
|
}),
|
|
153
155
|
getIsSticky: () => true,
|
|
154
|
-
onDrag: ({ self }) => setDropPosition(
|
|
156
|
+
onDrag: ({ self }) => setDropPosition(toInlineDropPosition(extractClosestEdge(self.data), direction)),
|
|
155
157
|
onDragLeave: () => setDropPosition(null),
|
|
156
158
|
onDrop: ({ source, self }) => {
|
|
157
159
|
setDropPosition(null);
|
|
158
160
|
const draggedId = source.data[VIEW_DRAG_ID];
|
|
159
|
-
const position =
|
|
161
|
+
const position = toInlineDropPosition(extractClosestEdge(self.data), direction);
|
|
160
162
|
if (typeof draggedId === "string" && position) reorder(draggedId, view.id, position);
|
|
161
163
|
}
|
|
162
164
|
}));
|
|
@@ -175,10 +177,7 @@ const WorkspaceViewTab = ({ actions, canReorder, direction, getDragData, getDrop
|
|
|
175
177
|
className: "relative flex h-full items-center",
|
|
176
178
|
ref: setTabContainer,
|
|
177
179
|
children: [
|
|
178
|
-
|
|
179
|
-
"aria-hidden": "true",
|
|
180
|
-
className: cn("bg-primary pointer-events-none absolute inset-y-1 z-20 w-0.5 rounded-full", dropPosition === "before" ? "start-0" : "end-0")
|
|
181
|
-
}),
|
|
180
|
+
/* @__PURE__ */ jsx(InlineDropIndicator, { position: dropPosition }),
|
|
182
181
|
/* @__PURE__ */ jsxs(TabsTab, {
|
|
183
182
|
className: cn("h-full pt-2 sm:h-full", reserveActionSpace ? "pe-6.5" : void 0),
|
|
184
183
|
onContextMenu: (event) => onContextMenu?.(view, event),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stll/workspace-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "Reusable workspace presentation components and view helpers for Stella.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"calculations",
|
|
@@ -94,10 +94,6 @@
|
|
|
94
94
|
"./workspace-frame": {
|
|
95
95
|
"types": "./dist/workspace-frame.d.ts",
|
|
96
96
|
"import": "./dist/workspace-frame.js"
|
|
97
|
-
},
|
|
98
|
-
"./view-switcher-logic": {
|
|
99
|
-
"types": "./dist/view-switcher.logic.d.ts",
|
|
100
|
-
"import": "./dist/view-switcher.logic.js"
|
|
101
97
|
}
|
|
102
98
|
},
|
|
103
99
|
"publishConfig": {
|
|
@@ -108,7 +104,7 @@
|
|
|
108
104
|
"build": "tsdown",
|
|
109
105
|
"pack:dry-run": "bun pm pack --dry-run",
|
|
110
106
|
"test": "bun test src",
|
|
111
|
-
"typecheck": "bun
|
|
107
|
+
"typecheck": "bun check --no-pretty --all --project=tsconfig.json",
|
|
112
108
|
"lint": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --report-unused-disable-directives-severity=error --type-aware --type-check packages/workspace-ui",
|
|
113
109
|
"lint:fix": "cd ../.. && bun --bun oxlint -c oxlint.config.ts --type-aware --fix packages/workspace-ui",
|
|
114
110
|
"format": "bun ../../scripts/run-oxfmt.ts .",
|
|
@@ -119,30 +115,30 @@
|
|
|
119
115
|
"@stll/calculations": "^0.1.2",
|
|
120
116
|
"@stll/conditions": "^0.4.0",
|
|
121
117
|
"@stll/money": "^0.3.1",
|
|
122
|
-
"@stll/ui": "^0.
|
|
118
|
+
"@stll/ui": "^0.45.0",
|
|
123
119
|
"better-result": "3.0.1",
|
|
124
120
|
"temporal-polyfill": "1.0.5",
|
|
125
121
|
"use-intl": "4.14.8"
|
|
126
122
|
},
|
|
127
123
|
"devDependencies": {
|
|
128
|
-
"@atlaskit/pragmatic-drag-and-drop": "^
|
|
129
|
-
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^
|
|
124
|
+
"@atlaskit/pragmatic-drag-and-drop": "^4.0.0",
|
|
125
|
+
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^3.0.0",
|
|
130
126
|
"@base-ui/react": "1.8.0",
|
|
131
127
|
"@stll/property-testing": "0.0.0",
|
|
132
128
|
"@stll/typescript-config": "0.0.0",
|
|
133
|
-
"@tanstack/react-table": "9.2.
|
|
129
|
+
"@tanstack/react-table": "9.2.6",
|
|
134
130
|
"@types/react": "^19.2.17",
|
|
135
131
|
"@types/react-dom": "^19.2.7",
|
|
136
|
-
"bun-types": "1.4.
|
|
132
|
+
"bun-types": "1.4.3",
|
|
137
133
|
"fast-check": "^4.10.2",
|
|
138
|
-
"react": "^19.
|
|
139
|
-
"react-dom": "^19.
|
|
134
|
+
"react": "^19.3.0",
|
|
135
|
+
"react-dom": "^19.3.0",
|
|
140
136
|
"tailwindcss": "4.3.3",
|
|
141
137
|
"tsdown": "0.23.0"
|
|
142
138
|
},
|
|
143
139
|
"peerDependencies": {
|
|
144
|
-
"@atlaskit/pragmatic-drag-and-drop": "^
|
|
145
|
-
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^
|
|
140
|
+
"@atlaskit/pragmatic-drag-and-drop": "^4.0.0",
|
|
141
|
+
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^3.0.0",
|
|
146
142
|
"@base-ui/react": "^1.7.0",
|
|
147
143
|
"@tanstack/react-table": "^9.1.2",
|
|
148
144
|
"@types/react": ">=19",
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Edge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/types";
|
|
2
|
-
//#region src/view-switcher.logic.d.ts
|
|
3
|
-
export type WorkspaceViewDirection = "ltr" | "rtl";
|
|
4
|
-
export type WorkspaceViewDropPosition = "before" | "after";
|
|
5
|
-
export declare const toWorkspaceViewDropPosition: (edge: Edge | null, direction: WorkspaceViewDirection) => WorkspaceViewDropPosition | null;
|
|
6
|
-
type ReorderWorkspaceViewIdsParams = {
|
|
7
|
-
ids: readonly string[];
|
|
8
|
-
draggedId: string;
|
|
9
|
-
targetId: string;
|
|
10
|
-
position: WorkspaceViewDropPosition;
|
|
11
|
-
};
|
|
12
|
-
export declare const reorderWorkspaceViewIds: ({ ids, draggedId, targetId, position }: ReorderWorkspaceViewIdsParams) => string[] | null;
|
|
13
|
-
//#endregion
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
//#region src/view-switcher.logic.ts
|
|
2
|
-
const toWorkspaceViewDropPosition = (edge, direction) => {
|
|
3
|
-
if (edge !== "left" && edge !== "right") return null;
|
|
4
|
-
return (direction === "rtl" ? edge === "left" : edge === "right") ? "after" : "before";
|
|
5
|
-
};
|
|
6
|
-
const reorderWorkspaceViewIds = ({ ids, draggedId, targetId, position }) => {
|
|
7
|
-
if (draggedId === targetId || !ids.includes(draggedId) || !ids.includes(targetId)) return null;
|
|
8
|
-
const withoutDragged = ids.filter((id) => id !== draggedId);
|
|
9
|
-
const targetIndex = withoutDragged.indexOf(targetId);
|
|
10
|
-
const reordered = withoutDragged.toSpliced(position === "after" ? targetIndex + 1 : targetIndex, 0, draggedId);
|
|
11
|
-
return reordered.every((id, index) => id === ids[index]) ? null : reordered;
|
|
12
|
-
};
|
|
13
|
-
//#endregion
|
|
14
|
-
export { reorderWorkspaceViewIds, toWorkspaceViewDropPosition };
|