@danske/sapphire-react-lab 0.103.0 → 0.105.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 -1
- package/build/cjs/index.js +1970 -748
- package/build/cjs/index.js.map +1 -1
- package/build/esm/Accordion/index.js +3 -1
- package/build/esm/Accordion/index.js.map +1 -1
- package/build/esm/Accordion/src/Accordion.js +28 -22
- package/build/esm/Accordion/src/Accordion.js.map +1 -1
- package/build/esm/Accordion/src/AccordionContext.js +2 -1
- package/build/esm/Accordion/src/AccordionContext.js.map +1 -1
- package/build/esm/Accordion/src/AccordionHeading.js +30 -10
- package/build/esm/Accordion/src/AccordionHeading.js.map +1 -1
- package/build/esm/Accordion/src/AccordionItem.js +54 -52
- package/build/esm/Accordion/src/AccordionItem.js.map +1 -1
- package/build/esm/Accordion/src/AccordionPanel.js +58 -0
- package/build/esm/Accordion/src/AccordionPanel.js.map +1 -0
- package/build/esm/Accordion/src/utils.js +7 -0
- package/build/esm/Accordion/src/utils.js.map +1 -0
- package/build/esm/Amount/src/Amount.js +76 -0
- package/build/esm/Amount/src/Amount.js.map +1 -0
- package/build/esm/Amount/src/useGroupAmount.js +35 -0
- package/build/esm/Amount/src/useGroupAmount.js.map +1 -0
- package/build/esm/Autocomplete/src/Autocomplete.js +13 -3
- package/build/esm/Autocomplete/src/Autocomplete.js.map +1 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js +31 -9
- package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js +1 -2
- package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -1
- package/build/esm/Filtering/src/FilterDropdown.js +8 -3
- package/build/esm/Filtering/src/FilterDropdown.js.map +1 -1
- package/build/esm/Filtering/src/SearchableSelectFilter.js +3 -1
- package/build/esm/Filtering/src/SearchableSelectFilter.js.map +1 -1
- package/build/esm/NumberField/src/NumberField.js +53 -21
- package/build/esm/NumberField/src/NumberField.js.map +1 -1
- package/build/esm/NumberField/src/StepperButton.js +8 -4
- package/build/esm/NumberField/src/StepperButton.js.map +1 -1
- package/build/esm/NumberField/src/cursorHelpers.js +55 -0
- package/build/esm/NumberField/src/cursorHelpers.js.map +1 -0
- package/build/esm/NumberField/src/formatHelpers.js +81 -0
- package/build/esm/NumberField/src/formatHelpers.js.map +1 -0
- package/build/esm/NumberField/src/keyboardHelpers.js +120 -0
- package/build/esm/NumberField/src/keyboardHelpers.js.map +1 -0
- package/build/esm/NumberField/src/useNumberFieldFormatting.js +94 -0
- package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +1 -0
- package/build/esm/NumberField/src/useSapphireNumberField.js +1 -1
- package/build/esm/NumberField/src/useSapphireNumberField.js.map +1 -1
- package/build/esm/Sidebar/index.js +23 -0
- package/build/esm/Sidebar/index.js.map +1 -0
- package/build/esm/Sidebar/src/Body.js +56 -0
- package/build/esm/Sidebar/src/Body.js.map +1 -0
- package/build/esm/Sidebar/src/ExpandableItem.js +133 -0
- package/build/esm/Sidebar/src/ExpandableItem.js.map +1 -0
- package/build/esm/Sidebar/src/Header.js +55 -0
- package/build/esm/Sidebar/src/Header.js.map +1 -0
- package/build/esm/Sidebar/src/Item.js +56 -0
- package/build/esm/Sidebar/src/Item.js.map +1 -0
- package/build/esm/Sidebar/src/List.js +52 -0
- package/build/esm/Sidebar/src/List.js.map +1 -0
- package/build/esm/Sidebar/src/Panel.js +104 -0
- package/build/esm/Sidebar/src/Panel.js.map +1 -0
- package/build/esm/Sidebar/src/ResponsiveSidebarContext.js +42 -0
- package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +1 -0
- package/build/esm/Sidebar/src/SecondarySidebarContext.js +35 -0
- package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +1 -0
- package/build/esm/Sidebar/src/Section.js +66 -0
- package/build/esm/Sidebar/src/Section.js.map +1 -0
- package/build/esm/Sidebar/src/Sidebar.js +114 -0
- package/build/esm/Sidebar/src/Sidebar.js.map +1 -0
- package/build/esm/Sidebar/src/useSidebar.js +29 -0
- package/build/esm/Sidebar/src/useSidebar.js.map +1 -0
- package/build/esm/TagGroup/src/Tag.js +31 -23
- package/build/esm/TagGroup/src/Tag.js.map +1 -1
- package/build/esm/index.js +2 -0
- package/build/esm/index.js.map +1 -1
- package/build/index.d.ts +238 -27
- package/package.json +35 -35
- package/build/esm/Accordion/src/useTreeState.js +0 -42
- package/build/esm/Accordion/src/useTreeState.js.map +0 -1
|
@@ -2,10 +2,12 @@ import { Accordion } from './src/Accordion.js';
|
|
|
2
2
|
import { AccordionHeading } from './src/AccordionHeading.js';
|
|
3
3
|
import { AccordionItem } from './src/AccordionItem.js';
|
|
4
4
|
export { AccordionContext } from './src/AccordionContext.js';
|
|
5
|
+
import { AccordionPanel } from './src/AccordionPanel.js';
|
|
5
6
|
|
|
6
7
|
const _Accordion = Object.assign(Accordion, {
|
|
7
8
|
Heading: AccordionHeading,
|
|
8
|
-
Item: AccordionItem
|
|
9
|
+
Item: AccordionItem,
|
|
10
|
+
Panel: AccordionPanel
|
|
9
11
|
});
|
|
10
12
|
|
|
11
13
|
export { _Accordion as Accordion };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/Accordion/index.ts"],"sourcesContent":["import { Accordion, type AccordionProps } from './src/Accordion';\nimport {\n AccordionHeading,\n AccordionHeadingProps,\n} from './src/AccordionHeading';\nimport { AccordionItem, type AccordionItemProps } from './src/AccordionItem';\nimport { AccordionContext } from './src/AccordionContext';\n\n/*\n * Before moving Accordion component to the core package, it's important to check on the\n * latest release of \"@react-aria/accordion\".\n * The hook and the component package are marked as \"pre-release\", so we can expect some changes.\n *\n * https://github.com/adobe/react-spectrum/issues/2801#issuecomment-1035377858\n * https://github.com/adobe/react-spectrum/discussions/6635#discussioncomment-9990027\n *\n * The current implementation is based on the SelectableCollection API, which creates bugs when\n * focusable items are used inside of the Accordion.Item.\n * E.g. UC-3414 (fixed), UC-3545 (to-do)\n *\n * Alternatively, we can re-implement the component.\n */\nconst _Accordion = Object.assign(Accordion, {\n Heading: AccordionHeading,\n Item: AccordionItem,\n});\n\nexport {\n _Accordion as Accordion,\n AccordionContext,\n type AccordionProps,\n type AccordionItemProps,\n type AccordionHeadingProps,\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/Accordion/index.ts"],"sourcesContent":["import { Accordion, type AccordionProps } from './src/Accordion';\nimport {\n AccordionHeading,\n AccordionHeadingProps,\n} from './src/AccordionHeading';\nimport { AccordionItem, type AccordionItemProps } from './src/AccordionItem';\nimport { AccordionContext } from './src/AccordionContext';\nimport { AccordionPanel, AccordionPanelProps } from './src/AccordionPanel';\n\n/*\n * Before moving Accordion component to the core package, it's important to check on the\n * latest release of \"@react-aria/accordion\".\n * The hook and the component package are marked as \"pre-release\", so we can expect some changes.\n *\n * https://github.com/adobe/react-spectrum/issues/2801#issuecomment-1035377858\n * https://github.com/adobe/react-spectrum/discussions/6635#discussioncomment-9990027\n *\n * The current implementation is based on the SelectableCollection API, which creates bugs when\n * focusable items are used inside of the Accordion.Item.\n * E.g. UC-3414 (fixed), UC-3545 (to-do)\n *\n * Alternatively, we can re-implement the component.\n */\nconst _Accordion = Object.assign(Accordion, {\n Heading: AccordionHeading,\n Item: AccordionItem,\n Panel: AccordionPanel,\n});\n\nexport {\n _Accordion as Accordion,\n AccordionContext,\n type AccordionProps,\n type AccordionItemProps,\n type AccordionHeadingProps,\n type AccordionPanelProps,\n};\n"],"names":[],"mappings":";;;;;;AAuBM,MAAA,UAAA,GAAa,MAAO,CAAA,MAAA,CAAO,SAAW,EAAA;AAAA,EAC1C,OAAS,EAAA,gBAAA;AAAA,EACT,IAAM,EAAA,aAAA;AAAA,EACN,KAAO,EAAA,cAAA;AAAA,CAAA;;;;"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import React, { forwardRef } from 'react';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
|
-
import {
|
|
4
|
-
import { useObjectRef, mergeProps, filterDOMProps } from '@react-aria/utils';
|
|
3
|
+
import { useObjectRef, filterDOMProps } from '@react-aria/utils';
|
|
5
4
|
import styles from '@danske/sapphire-css/components/accordion/accordion.module.css';
|
|
6
5
|
import { useThemeCheck, useSapphireStyleProps, withTruthyZero } from '@danske/sapphire-react';
|
|
7
|
-
import {
|
|
6
|
+
import { FocusScope } from '@react-aria/focus';
|
|
8
7
|
import { AccordionContext } from './AccordionContext.js';
|
|
9
|
-
import {
|
|
8
|
+
import { DisclosureGroup } from 'react-aria-components';
|
|
10
9
|
|
|
11
10
|
var __defProp = Object.defineProperty;
|
|
12
11
|
var __defProps = Object.defineProperties;
|
|
@@ -39,28 +38,41 @@ var __objRest = (source, exclude) => {
|
|
|
39
38
|
}
|
|
40
39
|
return target;
|
|
41
40
|
};
|
|
42
|
-
const
|
|
41
|
+
const Accordion = forwardRef(function Accordion2(_a, ref) {
|
|
43
42
|
var _b = _a, {
|
|
44
|
-
|
|
43
|
+
allowsMultipleExpanded = true,
|
|
45
44
|
headerLevel = 5,
|
|
46
45
|
hideLastDivider = false,
|
|
47
46
|
hasNegativeSideMargin = false,
|
|
48
|
-
sidePadding
|
|
47
|
+
sidePadding,
|
|
48
|
+
children,
|
|
49
|
+
expandedKeys,
|
|
50
|
+
defaultExpandedKeys,
|
|
51
|
+
onExpandedChange,
|
|
52
|
+
isDisabled
|
|
49
53
|
} = _b, props = __objRest(_b, [
|
|
50
|
-
"
|
|
54
|
+
"allowsMultipleExpanded",
|
|
51
55
|
"headerLevel",
|
|
52
56
|
"hideLastDivider",
|
|
53
57
|
"hasNegativeSideMargin",
|
|
54
|
-
"sidePadding"
|
|
58
|
+
"sidePadding",
|
|
59
|
+
"children",
|
|
60
|
+
"expandedKeys",
|
|
61
|
+
"defaultExpandedKeys",
|
|
62
|
+
"onExpandedChange",
|
|
63
|
+
"isDisabled"
|
|
55
64
|
]);
|
|
56
65
|
useThemeCheck();
|
|
57
66
|
const { styleProps } = useSapphireStyleProps(props);
|
|
58
|
-
const state = useTreeState(__spreadProps(__spreadValues({}, props), { expansionMode }));
|
|
59
67
|
const forwardedRef = useObjectRef(ref);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
68
|
+
return /* @__PURE__ */ React.createElement(FocusScope, null, /* @__PURE__ */ React.createElement(AccordionContext.Provider, {
|
|
69
|
+
value: { sidePadding, headerLevel }
|
|
70
|
+
}, /* @__PURE__ */ React.createElement(DisclosureGroup, __spreadProps(__spreadValues({}, filterDOMProps(props, { global: true, labelable: true })), {
|
|
71
|
+
allowsMultipleExpanded,
|
|
72
|
+
expandedKeys,
|
|
73
|
+
defaultExpandedKeys,
|
|
74
|
+
onExpandedChange,
|
|
75
|
+
isDisabled,
|
|
64
76
|
ref: forwardedRef,
|
|
65
77
|
className: clsx(styles["sapphire-accordion"], {
|
|
66
78
|
[styles["sapphire-accordion--without-last-divider"]]: hideLastDivider,
|
|
@@ -70,14 +82,8 @@ const _Accordion = (_a, ref) => {
|
|
|
70
82
|
marginLeft: typeof sidePadding === "string" ? `calc(${sidePadding} * -1)` : `-${sidePadding}px`,
|
|
71
83
|
width: `calc(100% + calc(${sidePadding} * 2${typeof sidePadding === "string" ? "" : "px"}))`
|
|
72
84
|
} : {}), styleProps.style)
|
|
73
|
-
}),
|
|
74
|
-
|
|
75
|
-
key: item.key,
|
|
76
|
-
item,
|
|
77
|
-
state
|
|
78
|
-
}))));
|
|
79
|
-
};
|
|
80
|
-
const Accordion = forwardRef(_Accordion);
|
|
85
|
+
}), children)));
|
|
86
|
+
});
|
|
81
87
|
|
|
82
88
|
export { Accordion };
|
|
83
89
|
//# sourceMappingURL=Accordion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.js","sources":["../../../../src/Accordion/src/Accordion.tsx"],"sourcesContent":["import React, { ForwardedRef,
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["../../../../src/Accordion/src/Accordion.tsx"],"sourcesContent":["import React, { ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps, useObjectRef } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport {\n SapphireStyleProps,\n TypographyHeadingProps,\n useSapphireStyleProps,\n useThemeCheck,\n withTruthyZero as hasAllowedCustomSidePadding,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FocusScope } from '@react-aria/focus';\n\nimport { AccordionContext } from './AccordionContext';\nimport { DisclosureGroup, DisclosureGroupProps } from 'react-aria-components';\n\nexport type TreeExpansionMode = 'single' | 'multiple';\n\nexport interface AccordionProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n DOMProps,\n Pick<\n DisclosureGroupProps,\n | 'allowsMultipleExpanded'\n | 'expandedKeys'\n | 'defaultExpandedKeys'\n | 'onExpandedChange'\n | 'children'\n | 'isDisabled'\n > {\n /** Set aria-level attribute for item's header. Accessibility requirement.\n * Defines the hierarchical level of an element within a page structure.\n * @default 5\n */\n headerLevel?: TypographyHeadingProps['level'];\n /**\n * Removes the divider after the last accordion item.\n * Useful when rendered in a container which already has borders.\n */\n hideLastDivider?: boolean;\n /**\n * Counter acts the side padding, so that accordion is shifted to the left with same amount\n * and having side padding * 2 added to width – resulting in full width accordion.\n * Useful in scenarions where accordion is inside a padded container and desired layout has accordion going from edge to edge horizontally.\n * @example\n * ```tsx\n * <Accordion hasNegativeSideMargin>...</Accordion>\n * ```\n */\n hasNegativeSideMargin?: boolean;\n /**\n * Add custom sized padding to the sides of the accordion items.\n * @example\n * ```tsx\n * <Accordion sidePadding={tokens.size.spacingContainerHorizontalM.value} hasNegativeSideMargin>...</Accordion>\n * ```\n */\n sidePadding?: number | string;\n}\n\nexport const Accordion = forwardRef(function Accordion(\n {\n allowsMultipleExpanded = true,\n headerLevel = 5,\n hideLastDivider = false,\n hasNegativeSideMargin = false,\n sidePadding,\n children,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled,\n ...props\n }: AccordionProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const forwardedRef = useObjectRef<HTMLDivElement>(ref);\n\n return (\n <FocusScope>\n <AccordionContext.Provider value={{ sidePadding, headerLevel }}>\n <DisclosureGroup\n {...filterDOMProps(props, { global: true, labelable: true })}\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys}\n defaultExpandedKeys={defaultExpandedKeys}\n onExpandedChange={onExpandedChange}\n isDisabled={isDisabled}\n ref={forwardedRef}\n className={clsx(\n styles['sapphire-accordion'],\n {\n [styles['sapphire-accordion--without-last-divider']]:\n hideLastDivider,\n [styles['sapphire-accordion--negative-margin-self']]:\n !hasAllowedCustomSidePadding(sidePadding) &&\n hasNegativeSideMargin,\n },\n styleProps.className\n )}\n style={{\n ...(hasAllowedCustomSidePadding(sidePadding) &&\n hasNegativeSideMargin\n ? {\n marginLeft:\n typeof sidePadding === 'string'\n ? `calc(${sidePadding} * -1)`\n : `-${sidePadding}px`,\n width: `calc(100% + calc(${sidePadding} * 2${\n typeof sidePadding === 'string' ? '' : 'px'\n }))`,\n }\n : {}),\n ...styleProps.style,\n }}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n </FocusScope>\n );\n});\n"],"names":["hasAllowedCustomSidePadding"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DO,MAAM,SAAY,GAAA,UAAA,CAAW,SAClC,UAAA,CAAA,EAAA,EAaA,GACA,EAAA;AAdA,EACE,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,IAAyB,sBAAA,GAAA,IAAA;AAAA,IACzB,WAAc,GAAA,CAAA;AAAA,IACd,eAAkB,GAAA,KAAA;AAAA,IAClB,qBAAwB,GAAA,KAAA;AAAA,IACxB,WAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,GAVF,GAAA,EAAA,EAWK,kBAXL,EAWK,EAAA;AAAA,IAVH,wBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,uBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,GAAA,CAAA,CAAA;AAKF,EAAA,aAAA,EAAA,CAAA;AACA,EAAM,MAAA,EAAE,eAAe,qBAAsB,CAAA,KAAA,CAAA,CAAA;AAC7C,EAAA,MAAM,eAAe,YAA6B,CAAA,GAAA,CAAA,CAAA;AAElD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,UAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAiB,QAAlB,EAAA;AAAA,IAA2B,KAAA,EAAO,EAAE,WAAa,EAAA,WAAA,EAAA;AAAA,GAC/C,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAD,aACM,CAAA,cAAA,CAAA,EAAA,EAAA,cAAA,CAAe,OAAO,EAAE,MAAA,EAAQ,IAAM,EAAA,SAAA,EAAW,IADvD,EAAA,CAAA,CAAA,EAAA;AAAA,IAEE,sBAAA;AAAA,IACA,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAK,EAAA,YAAA;AAAA,IACL,SAAA,EAAW,IACT,CAAA,MAAA,CAAO,oBACP,CAAA,EAAA;AAAA,MAAA,CACG,OAAO,0CACN,CAAA,GAAA,eAAA;AAAA,MAAA,CACD,MAAO,CAAA,0CAAA,CAAA,GACN,CAACA,cAAA,CAA4B,WAC7B,CAAA,IAAA,qBAAA;AAAA,KAAA,EAEJ,UAAW,CAAA,SAAA,CAAA;AAAA,IAEb,KAAO,EAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EACDA,cAA4B,CAAA,WAAA,CAAA,IAChC,qBACI,GAAA;AAAA,MACE,YACE,OAAO,WAAA,KAAgB,QACnB,GAAA,CAAA,KAAA,EAAQ,sBACR,CAAI,CAAA,EAAA,WAAA,CAAA,EAAA,CAAA;AAAA,MACV,OAAO,CAAoB,iBAAA,EAAA,WAAA,CAAA,IAAA,EACzB,OAAO,WAAA,KAAgB,WAAW,EAAK,GAAA,IAAA,CAAA,EAAA,CAAA;AAAA,KAAA,GAG3C,KACD,UAAW,CAAA,KAAA,CAAA;AAAA,GAGf,CAAA,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionContext.js","sources":["../../../../src/Accordion/src/AccordionContext.ts"],"sourcesContent":["import React, { useContext } from 'react';\n\ninterface AccordionContextProps {\n sidePadding?: number | string;\n}\n\nexport const AccordionContext = React.createContext<AccordionContextProps>({\n sidePadding: undefined,\n});\n\nexport function useAccordionContext(): AccordionContextProps {\n const context = useContext(AccordionContext);\n if (context) {\n return context;\n }\n throw new Error(\n 'Accordion context can only be used within Accordion component.'\n );\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"AccordionContext.js","sources":["../../../../src/Accordion/src/AccordionContext.ts"],"sourcesContent":["import { TypographyHeadingProps } from '@danske/sapphire-react';\nimport React, { useContext } from 'react';\n\ninterface AccordionContextProps {\n sidePadding?: number | string;\n headerLevel?: TypographyHeadingProps['level'];\n}\n\nexport const AccordionContext = React.createContext<AccordionContextProps>({\n sidePadding: undefined,\n headerLevel: 5,\n});\n\nexport function useAccordionContext(): AccordionContextProps {\n const context = useContext(AccordionContext);\n if (context) {\n return context;\n }\n throw new Error(\n 'Accordion context can only be used within Accordion component.'\n );\n}\n"],"names":[],"mappings":";;AAQa,MAAA,gBAAA,GAAmB,MAAM,aAAqC,CAAA;AAAA,EACzE,WAAa,EAAA,KAAA,CAAA;AAAA,EACb,WAAa,EAAA,CAAA;AAAA,CAAA,EAAA;AAG8C,SAAA,mBAAA,GAAA;AAC3D,EAAA,MAAM,UAAU,UAAW,CAAA,gBAAA,CAAA,CAAA;AAC3B,EAAA,IAAI,OAAS,EAAA;AACX,IAAO,OAAA,OAAA,CAAA;AAAA,GAAA;AAET,EAAA,MAAM,IAAI,KACR,CAAA,gEAAA,CAAA,CAAA;AAAA;;;;"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import { filterDOMProps } from '@react-aria/utils';
|
|
4
4
|
import styles from '@danske/sapphire-css/components/accordion/accordion.module.css';
|
|
5
|
+
import { withTruthyZero, Typography, Icon } from '@danske/sapphire-react';
|
|
6
|
+
import { ChevronDown } from '@danske/sapphire-icons/react';
|
|
7
|
+
import { Button } from 'react-aria-components';
|
|
8
|
+
import { useAccordionContext } from './AccordionContext.js';
|
|
9
|
+
import { customPaddingStyleProps } from './utils.js';
|
|
5
10
|
|
|
6
11
|
var __defProp = Object.defineProperty;
|
|
7
12
|
var __defProps = Object.defineProperties;
|
|
@@ -34,16 +39,31 @@ var __objRest = (source, exclude) => {
|
|
|
34
39
|
}
|
|
35
40
|
return target;
|
|
36
41
|
};
|
|
37
|
-
const AccordionHeading = (_a)
|
|
38
|
-
var _b = _a, {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const AccordionHeading = forwardRef(function AccordionHeading2(_a, ref) {
|
|
43
|
+
var _b = _a, { children, headerLevel } = _b, props = __objRest(_b, ["children", "headerLevel"]);
|
|
44
|
+
const { sidePadding, headerLevel: contextHeaderLevel } = useAccordionContext();
|
|
45
|
+
return /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({
|
|
46
|
+
role: "heading",
|
|
47
|
+
"aria-level": headerLevel != null ? headerLevel : contextHeaderLevel
|
|
48
|
+
}, filterDOMProps(props, { global: true })), {
|
|
49
|
+
ref
|
|
50
|
+
}), /* @__PURE__ */ React.createElement(Button, {
|
|
51
|
+
slot: "trigger",
|
|
52
|
+
className: ({ isFocusVisible }) => clsx(styles["sapphire-accordion__item-header"], styles["js-focus"], {
|
|
53
|
+
[styles["is-focus"]]: isFocusVisible
|
|
54
|
+
}),
|
|
55
|
+
style: withTruthyZero(sidePadding) ? customPaddingStyleProps(sidePadding) : {}
|
|
56
|
+
}, /* @__PURE__ */ React.createElement(Typography.Heading, {
|
|
57
|
+
level: 6,
|
|
58
|
+
elementType: "span"
|
|
59
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
44
60
|
className: clsx(styles["sapphire-accordion__item-heading"])
|
|
45
|
-
}
|
|
46
|
-
|
|
61
|
+
}, children)), /* @__PURE__ */ React.createElement("div", {
|
|
62
|
+
className: clsx(styles["sapphire-accordion__item-arrow"])
|
|
63
|
+
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
64
|
+
size: "lg"
|
|
65
|
+
}, /* @__PURE__ */ React.createElement(ChevronDown, null)))));
|
|
66
|
+
});
|
|
47
67
|
|
|
48
68
|
export { AccordionHeading };
|
|
49
69
|
//# sourceMappingURL=AccordionHeading.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionHeading.js","sources":["../../../../src/Accordion/src/AccordionHeading.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\n\nexport interface AccordionHeadingProps extends DOMProps {\n children?: ReactNode;\n}\n\nexport const AccordionHeading = (
|
|
1
|
+
{"version":3,"file":"AccordionHeading.js","sources":["../../../../src/Accordion/src/AccordionHeading.tsx"],"sourcesContent":["import React, { forwardRef, ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport {\n Icon,\n Typography,\n TypographyHeadingProps,\n withTruthyZero as hasAllowedCustomSidePadding,\n} from '@danske/sapphire-react';\nimport { ChevronDown } from '@danske/sapphire-icons/react';\nimport { Button } from 'react-aria-components';\nimport { useAccordionContext } from './AccordionContext';\nimport { customPaddingStyleProps } from './utils';\n\nexport interface AccordionHeadingProps extends DOMProps {\n children?: ReactNode;\n headerLevel?: TypographyHeadingProps['level'];\n}\n\nexport const AccordionHeading = forwardRef(function AccordionHeading(\n { children, headerLevel, ...props }: AccordionHeadingProps,\n ref: React.Ref<HTMLDivElement>\n): React.JSX.Element {\n const { sidePadding, headerLevel: contextHeaderLevel } =\n useAccordionContext();\n\n return (\n <div\n role=\"heading\"\n aria-level={headerLevel ?? contextHeaderLevel}\n {...filterDOMProps(props, { global: true })}\n ref={ref}\n >\n <Button\n slot=\"trigger\"\n className={({ isFocusVisible }) =>\n clsx(styles['sapphire-accordion__item-header'], styles['js-focus'], {\n [styles['is-focus']]: isFocusVisible,\n })\n }\n style={\n hasAllowedCustomSidePadding(sidePadding)\n ? customPaddingStyleProps(sidePadding)\n : {}\n }\n >\n <Typography.Heading level={6} elementType=\"span\">\n <div className={clsx(styles['sapphire-accordion__item-heading'])}>\n {children}\n </div>\n </Typography.Heading>\n <div className={clsx(styles['sapphire-accordion__item-arrow'])}>\n <Icon size=\"lg\">\n <ChevronDown />\n </Icon>\n </div>\n </Button>\n </div>\n );\n});\n"],"names":["hasAllowedCustomSidePadding"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,MAAM,gBAAmB,GAAA,UAAA,CAAW,SACzC,iBAAA,CAAA,EAAA,EACA,GACmB,EAAA;AAFnB,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,YAAU,WAAZ,EAAA,GAAA,EAAA,EAA4B,KAA5B,GAAA,SAAA,CAAA,EAAA,EAA4B,CAA1B,UAAU,EAAA,aAAA,CAAA,CAAA,CAAA;AAGZ,EAAM,MAAA,EAAE,WAAa,EAAA,WAAA,EAAa,kBAChC,EAAA,GAAA,mBAAA,EAAA,CAAA;AAEF,EAAA,2CACG,KAAD,EAAA,aAAA,CAAA,cAAA,CAAA;AAAA,IACE,IAAK,EAAA,SAAA;AAAA,IACL,cAAY,WAAe,IAAA,IAAA,GAAA,WAAA,GAAA,kBAAA;AAAA,GAAA,EACvB,cAAe,CAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,IAHtC,EAAA,CAAA,CAAA,EAAA;AAAA,IAIE,GAAA;AAAA,GAAA,CAAA,sCAEC,MAAD,EAAA;AAAA,IACE,IAAK,EAAA,SAAA;AAAA,IACL,SAAA,EAAW,CAAC,EAAE,cAAA,EAAA,KACZ,KAAK,MAAO,CAAA,iCAAA,CAAA,EAAoC,OAAO,UAAa,CAAA,EAAA;AAAA,MAAA,CACjE,OAAO,UAAc,CAAA,GAAA,cAAA;AAAA,KAAA,CAAA;AAAA,IAG1B,KACE,EAAAA,cAAA,CAA4B,WACxB,CAAA,GAAA,uBAAA,CAAwB,WACxB,CAAA,GAAA,EAAA;AAAA,GAGN,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAW,OAAZ,EAAA;AAAA,IAAoB,KAAO,EAAA,CAAA;AAAA,IAAG,WAAY,EAAA,MAAA;AAAA,GAAA,sCACvC,KAAD,EAAA;AAAA,IAAK,SAAA,EAAW,KAAK,MAAO,CAAA,kCAAA,CAAA,CAAA;AAAA,GACzB,EAAA,QAAA,CAAA,CAAA,sCAGJ,KAAD,EAAA;AAAA,IAAK,SAAA,EAAW,KAAK,MAAO,CAAA,gCAAA,CAAA,CAAA;AAAA,GAAA,sCACzB,IAAD,EAAA;AAAA,IAAM,IAAK,EAAA,IAAA;AAAA,GAAA,sCACR,WAAD,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA;;;;"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
|
-
import { useAccordionItem } from '@react-aria/accordion';
|
|
4
|
-
import { useFocusRing } from '@react-aria/focus';
|
|
5
|
-
import { mergeProps } from '@react-aria/utils';
|
|
6
|
-
import { Item } from '@react-stately/collections';
|
|
7
3
|
import styles from '@danske/sapphire-css/components/accordion/accordion.module.css';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
4
|
+
import { Disclosure } from 'react-aria-components';
|
|
5
|
+
import { useFocusManager } from '@react-aria/focus';
|
|
6
|
+
import { useObjectRef, useEvent } from '@react-aria/utils';
|
|
11
7
|
|
|
12
8
|
var __defProp = Object.defineProperty;
|
|
13
|
-
var __defProps = Object.defineProperties;
|
|
14
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
15
9
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
16
10
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
17
11
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -27,52 +21,60 @@ var __spreadValues = (a, b) => {
|
|
|
27
21
|
}
|
|
28
22
|
return a;
|
|
29
23
|
};
|
|
30
|
-
var
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
24
|
+
var __objRest = (source, exclude) => {
|
|
25
|
+
var target = {};
|
|
26
|
+
for (var prop in source)
|
|
27
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
if (source != null && __getOwnPropSymbols)
|
|
30
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
31
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
32
|
+
target[prop] = source[prop];
|
|
33
|
+
}
|
|
34
|
+
return target;
|
|
35
|
+
};
|
|
36
|
+
const AccordionItem = forwardRef(function AccordionItem2(_a, forwardedRef) {
|
|
37
|
+
var _b = _a, { children, id } = _b, props = __objRest(_b, ["children", "id"]);
|
|
38
|
+
const ref = useObjectRef(forwardedRef);
|
|
39
|
+
const focusManager = useFocusManager();
|
|
43
40
|
const onKeyDown = (e) => {
|
|
44
|
-
|
|
41
|
+
if (!focusManager)
|
|
42
|
+
return;
|
|
43
|
+
if (!(e.target instanceof Element) || e.target.getAttribute("slot") !== "trigger")
|
|
44
|
+
return;
|
|
45
|
+
switch (e.key) {
|
|
46
|
+
case "ArrowDown":
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
focusManager.focusNext();
|
|
49
|
+
break;
|
|
50
|
+
case "ArrowUp":
|
|
51
|
+
e.preventDefault();
|
|
52
|
+
focusManager.focusPrevious();
|
|
53
|
+
break;
|
|
54
|
+
case "Home":
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
focusManager.focusFirst();
|
|
57
|
+
break;
|
|
58
|
+
case "End":
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
focusManager.focusLast();
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
45
65
|
};
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
66
|
+
useEvent(ref, "keydown", onKeyDown);
|
|
67
|
+
return /* @__PURE__ */ React.createElement(Disclosure, __spreadValues({
|
|
68
|
+
ref,
|
|
69
|
+
id,
|
|
70
|
+
className: ({ isExpanded, isDisabled }) => clsx(styles["sapphire-accordion__item"], {
|
|
71
|
+
[styles["sapphire-accordion__item--open"]]: isExpanded,
|
|
49
72
|
[styles["is-disabled"]]: isDisabled
|
|
50
73
|
})
|
|
51
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
52
|
-
role: "heading",
|
|
53
|
-
"aria-level": props.headerLevel
|
|
54
|
-
}, /* @__PURE__ */ React.createElement("button", __spreadProps(__spreadValues({}, mergeProps(buttonProps, focusProps)), {
|
|
55
|
-
"aria-disabled": isDisabled,
|
|
56
|
-
ref,
|
|
57
|
-
className: clsx(styles["sapphire-accordion__item-header"], styles["js-focus"], {
|
|
58
|
-
[styles["is-focus"]]: isFocusVisible
|
|
59
|
-
}),
|
|
60
|
-
style: withTruthyZero(sidePadding) ? customPaddingStyleProps(sidePadding) : {}
|
|
61
|
-
}), /* @__PURE__ */ React.createElement(Typography.Heading, {
|
|
62
|
-
level: 6
|
|
63
|
-
}, item.props.heading), /* @__PURE__ */ React.createElement("div", {
|
|
64
|
-
className: clsx(styles["sapphire-accordion__item-arrow"])
|
|
65
|
-
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
66
|
-
size: "lg"
|
|
67
|
-
}, /* @__PURE__ */ React.createElement(ChevronDown, null))))), /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({}, mergeProps(regionProps, { onKeyDown })), {
|
|
68
|
-
"aria-hidden": !isOpen,
|
|
74
|
+
}, props), /* @__PURE__ */ React.createElement("div", {
|
|
69
75
|
className: clsx(styles["sapphire-accordion__item-content-wrapper"])
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
style: withTruthyZero(sidePadding) ? customPaddingStyleProps(sidePadding) : {}
|
|
73
|
-
}, item.props.children)));
|
|
74
|
-
}
|
|
75
|
-
const AccordionItem = Item;
|
|
76
|
+
}, children));
|
|
77
|
+
});
|
|
76
78
|
|
|
77
|
-
export { AccordionItem
|
|
79
|
+
export { AccordionItem };
|
|
78
80
|
//# sourceMappingURL=AccordionItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionItem.js","sources":["../../../../src/Accordion/src/AccordionItem.tsx"],"sourcesContent":["import React, {
|
|
1
|
+
{"version":3,"file":"AccordionItem.js","sources":["../../../../src/Accordion/src/AccordionItem.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\n\nimport { Disclosure } from 'react-aria-components';\nimport { DisclosureProps } from 'react-aria-components';\nimport { useFocusManager } from '@react-aria/focus';\nimport { useEvent, useObjectRef } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\n\nexport interface AccordionItemProps\n extends DOMProps,\n Pick<DisclosureProps, 'children' | 'isDisabled'> {}\n\nexport const AccordionItem = forwardRef(function AccordionItem(\n { children, id, ...props }: AccordionItemProps,\n forwardedRef: React.Ref<HTMLDivElement>\n): JSX.Element {\n const ref = useObjectRef<HTMLDivElement>(forwardedRef);\n const focusManager = useFocusManager();\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!focusManager) return;\n\n if (\n !(e.target instanceof Element) ||\n e.target.getAttribute('slot') !== 'trigger'\n )\n return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusManager.focusNext();\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusManager.focusPrevious();\n break;\n case 'Home':\n e.preventDefault();\n focusManager.focusFirst();\n break;\n case 'End':\n e.preventDefault();\n focusManager.focusLast();\n break;\n default:\n return;\n }\n };\n\n useEvent(ref, 'keydown', onKeyDown);\n\n return (\n <Disclosure\n ref={ref}\n id={id}\n className={({ isExpanded, isDisabled }) =>\n clsx(styles['sapphire-accordion__item'], {\n [styles['sapphire-accordion__item--open']]: isExpanded,\n [styles['is-disabled']]: isDisabled,\n })\n }\n {...props}\n >\n <div className={clsx(styles['sapphire-accordion__item-content-wrapper'])}>\n {children}\n </div>\n </Disclosure>\n );\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,aAAgB,GAAA,UAAA,CAAW,SACtC,cAAA,CAAA,EAAA,EACA,YACa,EAAA;AAFb,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,YAAU,EAAZ,EAAA,GAAA,EAAA,EAAmB,KAAnB,GAAA,SAAA,CAAA,EAAA,EAAmB,CAAjB,UAAU,EAAA,IAAA,CAAA,CAAA,CAAA;AAGZ,EAAA,MAAM,MAAM,YAA6B,CAAA,YAAA,CAAA,CAAA;AACzC,EAAA,MAAM,YAAe,GAAA,eAAA,EAAA,CAAA;AAErB,EAAM,MAAA,SAAA,GAAY,CAAC,CAAqB,KAAA;AACtC,IAAA,IAAI,CAAC,YAAA;AAAc,MAAA,OAAA;AAEnB,IAAA,IACE,EAAI,CAAA,CAAA,MAAA,YAAkB,YACtB,CAAE,CAAA,MAAA,CAAO,aAAa,MAAY,CAAA,KAAA,SAAA;AAElC,MAAA,OAAA;AAEF,IAAA,QAAQ,CAAE,CAAA,GAAA;AAAA,MACH,KAAA,WAAA;AACH,QAAE,CAAA,CAAA,cAAA,EAAA,CAAA;AACF,QAAa,YAAA,CAAA,SAAA,EAAA,CAAA;AACb,QAAA,MAAA;AAAA,MACG,KAAA,SAAA;AACH,QAAE,CAAA,CAAA,cAAA,EAAA,CAAA;AACF,QAAa,YAAA,CAAA,aAAA,EAAA,CAAA;AACb,QAAA,MAAA;AAAA,MACG,KAAA,MAAA;AACH,QAAE,CAAA,CAAA,cAAA,EAAA,CAAA;AACF,QAAa,YAAA,CAAA,UAAA,EAAA,CAAA;AACb,QAAA,MAAA;AAAA,MACG,KAAA,KAAA;AACH,QAAE,CAAA,CAAA,cAAA,EAAA,CAAA;AACF,QAAa,YAAA,CAAA,SAAA,EAAA,CAAA;AACb,QAAA,MAAA;AAAA,MAAA;AAEA,QAAA,OAAA;AAAA,KAAA;AAAA,GAAA,CAAA;AAIN,EAAA,QAAA,CAAS,KAAK,SAAW,EAAA,SAAA,CAAA,CAAA;AAEzB,EAAA,2CACG,UAAD,EAAA,cAAA,CAAA;AAAA,IACE,GAAA;AAAA,IACA,EAAA;AAAA,IACA,WAAW,CAAC,EAAE,YAAY,UACxB,EAAA,KAAA,IAAA,CAAK,OAAO,0BAA6B,CAAA,EAAA;AAAA,MAAA,CACtC,OAAO,gCAAoC,CAAA,GAAA,UAAA;AAAA,MAAA,CAC3C,OAAO,aAAiB,CAAA,GAAA,UAAA;AAAA,KAAA,CAAA;AAAA,GAGzB,EAAA,KAAA,CAAA,sCAEH,KAAD,EAAA;AAAA,IAAK,SAAA,EAAW,KAAK,MAAO,CAAA,0CAAA,CAAA,CAAA;AAAA,GACzB,EAAA,QAAA,CAAA,CAAA,CAAA;AAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { filterDOMProps } from '@react-aria/utils';
|
|
4
|
+
import styles from '@danske/sapphire-css/components/accordion/accordion.module.css';
|
|
5
|
+
import { DisclosurePanel } from 'react-aria-components';
|
|
6
|
+
import { useAccordionContext } from './AccordionContext.js';
|
|
7
|
+
import { customPaddingStyleProps } from './utils.js';
|
|
8
|
+
import { withTruthyZero } from '@danske/sapphire-react';
|
|
9
|
+
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __defProps = Object.defineProperties;
|
|
12
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
13
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
14
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
15
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
16
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
17
|
+
var __spreadValues = (a, b) => {
|
|
18
|
+
for (var prop in b || (b = {}))
|
|
19
|
+
if (__hasOwnProp.call(b, prop))
|
|
20
|
+
__defNormalProp(a, prop, b[prop]);
|
|
21
|
+
if (__getOwnPropSymbols)
|
|
22
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
23
|
+
if (__propIsEnum.call(b, prop))
|
|
24
|
+
__defNormalProp(a, prop, b[prop]);
|
|
25
|
+
}
|
|
26
|
+
return a;
|
|
27
|
+
};
|
|
28
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
29
|
+
var __objRest = (source, exclude) => {
|
|
30
|
+
var target = {};
|
|
31
|
+
for (var prop in source)
|
|
32
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
33
|
+
target[prop] = source[prop];
|
|
34
|
+
if (source != null && __getOwnPropSymbols)
|
|
35
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
36
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
37
|
+
target[prop] = source[prop];
|
|
38
|
+
}
|
|
39
|
+
return target;
|
|
40
|
+
};
|
|
41
|
+
const AccordionPanel = forwardRef(function AccordionPanel2(_a, ref) {
|
|
42
|
+
var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
|
|
43
|
+
const { sidePadding } = useAccordionContext();
|
|
44
|
+
return /* @__PURE__ */ React.createElement(DisclosurePanel, __spreadValues(__spreadProps(__spreadValues({
|
|
45
|
+
ref
|
|
46
|
+
}, filterDOMProps(props, { global: true })), {
|
|
47
|
+
className: clsx(styles["sapphire-accordion__item-content"]),
|
|
48
|
+
style: {
|
|
49
|
+
height: "var(--disclosure-panel-height)"
|
|
50
|
+
}
|
|
51
|
+
}), props), /* @__PURE__ */ React.createElement("div", {
|
|
52
|
+
style: __spreadValues({}, withTruthyZero(sidePadding) ? customPaddingStyleProps(sidePadding) : {}),
|
|
53
|
+
className: styles["sapphire-accordion__item-content-inner"]
|
|
54
|
+
}, children));
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export { AccordionPanel };
|
|
58
|
+
//# sourceMappingURL=AccordionPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccordionPanel.js","sources":["../../../../src/Accordion/src/AccordionPanel.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from '@react-aria/utils';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport { DisclosurePanel, DisclosurePanelProps } from 'react-aria-components';\nimport { useAccordionContext } from './AccordionContext';\nimport { customPaddingStyleProps } from './utils';\nimport { withTruthyZero as hasAllowedCustomSidePadding } from '@danske/sapphire-react';\nimport { DOMProps } from '@react-types/shared';\n\nexport interface AccordionPanelProps\n extends DOMProps,\n Pick<DisclosurePanelProps, 'children' | 'role'> {}\n\nexport const AccordionPanel = forwardRef(function AccordionPanel(\n { children, ...props }: AccordionPanelProps,\n ref: React.Ref<HTMLDivElement>\n): React.JSX.Element {\n const { sidePadding } = useAccordionContext();\n\n return (\n <DisclosurePanel\n ref={ref}\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-accordion__item-content'])}\n style={{\n /**\n * useDisclosure hook from react-aria uses css variable --disclosure-panel-height to\n * animate the height of the panel.\n */\n height: 'var(--disclosure-panel-height)',\n }}\n {...props}\n >\n <div\n style={{\n ...(hasAllowedCustomSidePadding(sidePadding)\n ? customPaddingStyleProps(sidePadding)\n : {}),\n }}\n className={styles['sapphire-accordion__item-content-inner']}\n >\n {children}\n </div>\n </DisclosurePanel>\n );\n});\n"],"names":["hasAllowedCustomSidePadding"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,cAAiB,GAAA,UAAA,CAAW,SACvC,eAAA,CAAA,EAAA,EACA,GACmB,EAAA;AAFnB,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,EAAF,QAAA,EAAA,GAAA,EAAA,EAAe,KAAf,GAAA,SAAA,CAAA,EAAA,EAAe,CAAb,UAAA,CAAA,CAAA,CAAA;AAGF,EAAA,MAAM,EAAE,WAAgB,EAAA,GAAA,mBAAA,EAAA,CAAA;AAExB,EAAA,2CACG,eAAD,EAAA,cAAA,CAAA,aAAA,CAAA,cAAA,CAAA;AAAA,IACE,GAAA;AAAA,GAAA,EACI,cAAe,CAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,IAFtC,EAAA,CAAA,CAAA,EAAA;AAAA,IAGE,SAAA,EAAW,KAAK,MAAO,CAAA,kCAAA,CAAA,CAAA;AAAA,IACvB,KAAO,EAAA;AAAA,MAKL,MAAQ,EAAA,gCAAA;AAAA,KAAA;AAAA,GAEN,CAAA,EAAA,KAAA,CAAA,sCAEH,KAAD,EAAA;AAAA,IACE,KAAO,EAAA,cAAA,CAAA,EAAA,EACDA,cAA4B,CAAA,WAAA,CAAA,GAC5B,wBAAwB,WACxB,CAAA,GAAA,EAAA,CAAA;AAAA,IAEN,WAAW,MAAO,CAAA,wCAAA,CAAA;AAAA,GAEjB,EAAA,QAAA,CAAA,CAAA,CAAA;AAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const customPaddingStyleProps = (sidePadding) => ({
|
|
2
|
+
paddingLeft: typeof sidePadding === "string" ? sidePadding : `${sidePadding}px`,
|
|
3
|
+
paddingRight: typeof sidePadding === "string" ? sidePadding : `${sidePadding}px`
|
|
4
|
+
});
|
|
5
|
+
|
|
6
|
+
export { customPaddingStyleProps };
|
|
7
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/Accordion/src/utils.ts"],"sourcesContent":["export const customPaddingStyleProps = (sidePadding: number | string) => ({\n paddingLeft:\n typeof sidePadding === 'string' ? sidePadding : `${sidePadding}px`,\n paddingRight:\n typeof sidePadding === 'string' ? sidePadding : `${sidePadding}px`,\n});\n"],"names":[],"mappings":"AAAa,MAAA,uBAAA,GAA0B,CAAC,WAAkC,MAAA;AAAA,EACxE,WACE,EAAA,OAAO,WAAgB,KAAA,QAAA,GAAW,cAAc,CAAG,EAAA,WAAA,CAAA,EAAA,CAAA;AAAA,EACrD,YACE,EAAA,OAAO,WAAgB,KAAA,QAAA,GAAW,cAAc,CAAG,EAAA,WAAA,CAAA,EAAA,CAAA;AAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { useThemeCheck, useSapphireStyleProps, Typography } from '@danske/sapphire-react';
|
|
3
|
+
import { useLocale } from '@react-aria/i18n';
|
|
4
|
+
import { useGroupAmount } from './useGroupAmount.js';
|
|
5
|
+
import styles from '@danske/sapphire-css/components/amount/amount.module.css';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defProps = Object.defineProperties;
|
|
9
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
26
|
+
var __objRest = (source, exclude) => {
|
|
27
|
+
var target = {};
|
|
28
|
+
for (var prop in source)
|
|
29
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
30
|
+
target[prop] = source[prop];
|
|
31
|
+
if (source != null && __getOwnPropSymbols)
|
|
32
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
33
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
34
|
+
target[prop] = source[prop];
|
|
35
|
+
}
|
|
36
|
+
return target;
|
|
37
|
+
};
|
|
38
|
+
const Amount = (_a) => {
|
|
39
|
+
var _b = _a, {
|
|
40
|
+
emphasis = "regular",
|
|
41
|
+
variant,
|
|
42
|
+
formatOptions,
|
|
43
|
+
value,
|
|
44
|
+
size
|
|
45
|
+
} = _b, props = __objRest(_b, [
|
|
46
|
+
"emphasis",
|
|
47
|
+
"variant",
|
|
48
|
+
"formatOptions",
|
|
49
|
+
"value",
|
|
50
|
+
"size"
|
|
51
|
+
]);
|
|
52
|
+
useThemeCheck();
|
|
53
|
+
const { styleProps, filteredProps } = useSapphireStyleProps(props);
|
|
54
|
+
const { locale } = useLocale();
|
|
55
|
+
const formatter = useMemo(() => new Intl.NumberFormat(locale, __spreadValues({
|
|
56
|
+
style: (formatOptions == null ? void 0 : formatOptions.currency) ? "currency" : void 0,
|
|
57
|
+
signDisplay: (formatOptions == null ? void 0 : formatOptions.signDisplay) || String(value).startsWith("+") ? "always" : "auto",
|
|
58
|
+
minimumFractionDigits: 2
|
|
59
|
+
}, formatOptions)), [locale, formatOptions, value]);
|
|
60
|
+
const { formattedValue, groupedParts } = useGroupAmount(value, formatter);
|
|
61
|
+
return /* @__PURE__ */ React.createElement("span", __spreadProps(__spreadValues({
|
|
62
|
+
style: styleProps.style,
|
|
63
|
+
className: styles["sapphire-amount"]
|
|
64
|
+
}, filteredProps), {
|
|
65
|
+
"aria-label": formattedValue
|
|
66
|
+
}), groupedParts.map((part, index) => /* @__PURE__ */ React.createElement(Typography.Body, {
|
|
67
|
+
elementType: "span",
|
|
68
|
+
key: index,
|
|
69
|
+
color: variant === "positive" ? "positive" : "primary",
|
|
70
|
+
isSemibold: emphasis === "primary" ? true : false,
|
|
71
|
+
size
|
|
72
|
+
}, part.value)));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export { Amount };
|
|
76
|
+
//# sourceMappingURL=Amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Amount.js","sources":["../../../../src/Amount/src/Amount.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n useThemeCheck,\n SapphireStyleProps,\n GlobalDomAttributes,\n Typography,\n TypographyBodyProps,\n useSapphireStyleProps,\n} from '@danske/sapphire-react';\nimport React from 'react';\nimport { useLocale } from '@react-aria/i18n';\nimport { useGroupAmount } from './useGroupAmount';\nimport styles from '@danske/sapphire-css/components/amount/amount.module.css';\n\n/**\n * Format options for currency amounts.\n * The style is always 'currency', so only currency-related options are exposed.\n */\nexport type CurrencyFormatOptions = Pick<\n Intl.NumberFormatOptions,\n | 'currency'\n | 'currencyDisplay'\n | 'currencySign'\n | 'signDisplay'\n | 'minimumFractionDigits'\n | 'maximumFractionDigits'\n | 'minimumSignificantDigits'\n | 'maximumSignificantDigits'\n | 'useGrouping'\n | 'notation'\n>;\n\nexport type AmountProps = {\n /**\n * When displaying amounts, readability and visual hierarchy are key. Use medium weight for primary emphasis to highlight amounts or regular weight for secondary emphasis.\n *\n * @default 'regular'\n */\n emphasis?: 'primary' | 'regular';\n /**\n * The variant of the Amount component. `positive` shows a green color, and should be used for amounts greater than zero.\n *\n * @default 'neutal'\n */\n variant?: 'neutal' | 'positive';\n /**\n * The amount value to be formatted and displayed.\n *\n * If displaying the sign is a requirement, ensure the value is a string that starts with '+' or '-'.\n * Alternatively, you can use the `signDisplay` option in `formatOptions` to control the display of the sign for numeric values.\n */\n value: string | number;\n /** Currency formatting options */\n formatOptions?: CurrencyFormatOptions;\n} & Pick<TypographyBodyProps, 'size'> &\n SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const Amount = ({\n emphasis = 'regular',\n variant,\n formatOptions,\n value,\n size,\n ...props\n}: AmountProps): JSX.Element => {\n useThemeCheck();\n const { styleProps, filteredProps } = useSapphireStyleProps(props);\n const { locale } = useLocale();\n\n const formatter = useMemo(\n () =>\n new Intl.NumberFormat(locale, {\n style: formatOptions?.currency ? 'currency' : undefined,\n /**\n * Always show the sign if the value starts with '+' or '-'.\n */\n signDisplay:\n formatOptions?.signDisplay || String(value).startsWith('+')\n ? 'always'\n : 'auto',\n minimumFractionDigits: 2,\n ...formatOptions,\n }),\n [locale, formatOptions, value]\n );\n\n const { formattedValue, groupedParts } = useGroupAmount(value, formatter);\n\n return (\n <span\n style={styleProps.style}\n className={styles['sapphire-amount']}\n {...filteredProps}\n aria-label={formattedValue}\n >\n {groupedParts.map((part, index) => (\n <Typography.Body\n elementType=\"span\"\n key={index}\n color={variant === 'positive' ? 'positive' : 'primary'}\n isSemibold={emphasis === 'primary' ? true : false}\n size={size}\n >\n {part.value}\n </Typography.Body>\n ))}\n </span>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0Da,MAAA,MAAA,GAAS,CAAC,EAOS,KAAA;AAPT,EACrB,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,IAAW,QAAA,GAAA,SAAA;AAAA,IACX,OAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,GALqB,GAAA,EAAA,EAMlB,kBANkB,EAMlB,EAAA;AAAA,IALH,UAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,GAAA,CAAA,CAAA;AAGA,EAAA,aAAA,EAAA,CAAA;AACA,EAAM,MAAA,EAAE,UAAY,EAAA,aAAA,EAAA,GAAkB,qBAAsB,CAAA,KAAA,CAAA,CAAA;AAC5D,EAAA,MAAM,EAAE,MAAW,EAAA,GAAA,SAAA,EAAA,CAAA;AAEnB,EAAA,MAAM,YAAY,OAChB,CAAA,MACE,IAAI,IAAA,CAAK,aAAa,MAAQ,EAAA,cAAA,CAAA;AAAA,IAC5B,KAAA,EAAO,CAAe,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAA,QAAA,IAAW,UAAa,GAAA,KAAA,CAAA;AAAA,IAI9C,aACE,CAAe,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAA,WAAA,KAAe,OAAO,KAAO,CAAA,CAAA,UAAA,CAAW,OACnD,QACA,GAAA,MAAA;AAAA,IACN,qBAAuB,EAAA,CAAA;AAAA,GACpB,EAAA,aAAA,CAAA,CAAA,EAEP,CAAC,MAAA,EAAQ,aAAe,EAAA,KAAA,CAAA,CAAA,CAAA;AAG1B,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAiB,EAAA,GAAA,cAAA,CAAe,KAAO,EAAA,SAAA,CAAA,CAAA;AAE/D,EAAA,2CACG,MAAD,EAAA,aAAA,CAAA,cAAA,CAAA;AAAA,IACE,OAAO,UAAW,CAAA,KAAA;AAAA,IAClB,WAAW,MAAO,CAAA,iBAAA,CAAA;AAAA,GAAA,EACd,aAHN,CAAA,EAAA;AAAA,IAIE,YAAY,EAAA,cAAA;AAAA,GAAA,CAAA,EAEX,aAAa,GAAI,CAAA,CAAC,MAAM,KACvB,qBAAA,KAAA,CAAA,aAAA,CAAC,WAAW,IAAZ,EAAA;AAAA,IACE,WAAY,EAAA,MAAA;AAAA,IACZ,GAAK,EAAA,KAAA;AAAA,IACL,KAAA,EAAO,OAAY,KAAA,UAAA,GAAa,UAAa,GAAA,SAAA;AAAA,IAC7C,UAAA,EAAY,QAAa,KAAA,SAAA,GAAY,IAAO,GAAA,KAAA;AAAA,IAC5C,IAAA;AAAA,GAAA,EAEC,IAAK,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
const useGroupAmount = (value, formatter) => {
|
|
4
|
+
const numberValue = useMemo(() => {
|
|
5
|
+
const parsed = Number(value);
|
|
6
|
+
return isNaN(parsed) ? 0 : parsed;
|
|
7
|
+
}, [value]);
|
|
8
|
+
const groupedParts = useMemo(() => {
|
|
9
|
+
const parts = formatter.formatToParts(numberValue);
|
|
10
|
+
const result = [];
|
|
11
|
+
let currentNumber = "";
|
|
12
|
+
parts.forEach((part) => {
|
|
13
|
+
if (part.type === "plusSign" || part.type === "minusSign") {
|
|
14
|
+
result.push({ type: "sign", value: part.value });
|
|
15
|
+
} else if (part.type === "currency") {
|
|
16
|
+
if (currentNumber) {
|
|
17
|
+
result.push({ type: "number", value: currentNumber });
|
|
18
|
+
currentNumber = "";
|
|
19
|
+
}
|
|
20
|
+
result.push({ type: "currency", value: part.value });
|
|
21
|
+
} else if (part.type !== "literal") {
|
|
22
|
+
currentNumber += part.value;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
if (currentNumber) {
|
|
26
|
+
result.push({ type: "number", value: currentNumber });
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}, [numberValue, formatter]);
|
|
30
|
+
const formattedValue = useMemo(() => groupedParts.map((part) => part.value).join(""), [groupedParts]);
|
|
31
|
+
return { formattedValue, groupedParts };
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { useGroupAmount };
|
|
35
|
+
//# sourceMappingURL=useGroupAmount.js.map
|