@helsenorge/designsystem-react 16.0.0 → 16.1.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.
Files changed (112) hide show
  1. package/lib/CHANGELOG.md +12 -0
  2. package/lib/Drawer.js +1 -0
  3. package/lib/Drawer.js.map +1 -1
  4. package/lib/Expander.js +1 -0
  5. package/lib/Expander.js.map +1 -1
  6. package/lib/HorizontalScroll.js +6 -10
  7. package/lib/HorizontalScroll.js.map +1 -1
  8. package/lib/StackedCellContent.js +15 -0
  9. package/lib/StackedCellContent.js.map +1 -0
  10. package/lib/TabPanel.js +1 -0
  11. package/lib/TabPanel.js.map +1 -1
  12. package/lib/TableContext.js +26 -0
  13. package/lib/TableContext.js.map +1 -0
  14. package/lib/UNSAFE_TableBody.js +22 -0
  15. package/lib/UNSAFE_TableBody.js.map +1 -0
  16. package/lib/UNSAFE_TableCell.js +26 -0
  17. package/lib/UNSAFE_TableCell.js.map +1 -0
  18. package/lib/UNSAFE_TableDetail.js +17 -0
  19. package/lib/UNSAFE_TableDetail.js.map +1 -0
  20. package/lib/UNSAFE_TableExpandedRow.js +46 -0
  21. package/lib/UNSAFE_TableExpandedRow.js.map +1 -0
  22. package/lib/UNSAFE_TableHead.js +25 -0
  23. package/lib/UNSAFE_TableHead.js.map +1 -0
  24. package/lib/UNSAFE_TableHeadCell.js +182 -0
  25. package/lib/UNSAFE_TableHeadCell.js.map +1 -0
  26. package/lib/UNSAFE_TableRow.js +130 -0
  27. package/lib/UNSAFE_TableRow.js.map +1 -0
  28. package/lib/__mocks__/ResizeObserver.js +4 -1
  29. package/lib/__mocks__/ResizeObserver.js.map +1 -1
  30. package/lib/components/Duolist/styles.module.scss +3 -7
  31. package/lib/components/ExpanderHierarchy/index.js +1 -0
  32. package/lib/components/ExpanderHierarchy/index.js.map +1 -1
  33. package/lib/components/ExpanderList/index.js +1 -0
  34. package/lib/components/ExpanderList/index.js.map +1 -1
  35. package/lib/components/ExpanderList/styles.module.scss +1 -0
  36. package/lib/components/HorizontalScroll/HorizontalScroll.d.ts +0 -4
  37. package/lib/components/HorizontalScroll/styles.module.scss +1 -4
  38. package/lib/components/HorizontalScroll/styles.module.scss.d.ts +0 -1
  39. package/lib/components/Modal/index.js +4 -1
  40. package/lib/components/Modal/index.js.map +1 -1
  41. package/lib/components/PopMenu/PopMenu.d.ts +4 -0
  42. package/lib/components/PopMenu/index.js +3 -1
  43. package/lib/components/PopMenu/index.js.map +1 -1
  44. package/lib/components/Table/index.js +0 -1
  45. package/lib/components/Table/index.js.map +1 -1
  46. package/lib/components/UNSAFE_Table/StackedCellContent.d.ts +9 -0
  47. package/lib/components/UNSAFE_Table/TableCaption.d.ts +10 -0
  48. package/lib/components/UNSAFE_Table/TableContext.d.ts +22 -0
  49. package/lib/components/UNSAFE_Table/UNSAFE_Table.d.ts +37 -0
  50. package/lib/components/UNSAFE_Table/UNSAFE_TableBody/UNSAFE_TableBody.d.ts +10 -0
  51. package/lib/components/UNSAFE_Table/UNSAFE_TableBody/index.d.ts +3 -0
  52. package/lib/components/UNSAFE_Table/UNSAFE_TableBody/index.js +2 -0
  53. package/lib/components/UNSAFE_Table/UNSAFE_TableCell/UNSAFE_TableCell.d.ts +15 -0
  54. package/lib/components/UNSAFE_Table/UNSAFE_TableCell/index.d.ts +3 -0
  55. package/lib/components/UNSAFE_Table/UNSAFE_TableCell/index.js +7 -0
  56. package/lib/components/UNSAFE_Table/UNSAFE_TableCell/index.js.map +1 -0
  57. package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/UNSAFE_TableDetail.d.ts +12 -0
  58. package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/index.d.ts +3 -0
  59. package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/index.js +7 -0
  60. package/lib/components/UNSAFE_Table/UNSAFE_TableDetail/index.js.map +1 -0
  61. package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/UNSAFE_TableExpandedRow.d.ts +17 -0
  62. package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/index.d.ts +3 -0
  63. package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/index.js +7 -0
  64. package/lib/components/UNSAFE_Table/UNSAFE_TableExpandedRow/index.js.map +1 -0
  65. package/lib/components/UNSAFE_Table/UNSAFE_TableExpanderCell/UNSAFE_TableExpanderCellMobile.d.ts +4 -0
  66. package/lib/components/UNSAFE_Table/UNSAFE_TableHead/UNSAFE_TableHead.d.ts +8 -0
  67. package/lib/components/UNSAFE_Table/UNSAFE_TableHead/index.d.ts +3 -0
  68. package/lib/components/UNSAFE_Table/UNSAFE_TableHead/index.js +7 -0
  69. package/lib/components/UNSAFE_Table/UNSAFE_TableHead/index.js.map +1 -0
  70. package/lib/components/UNSAFE_Table/UNSAFE_TableHeadCell/UNSAFE_TableHeadCell.d.ts +15 -0
  71. package/lib/components/UNSAFE_Table/UNSAFE_TableHeadCell/index.d.ts +3 -0
  72. package/lib/components/UNSAFE_Table/UNSAFE_TableHeadCell/index.js +2 -0
  73. package/lib/components/UNSAFE_Table/UNSAFE_TablePopMenuCell/UNSAFE_TablePopMenuCell.d.ts +8 -0
  74. package/lib/components/UNSAFE_Table/UNSAFE_TableRow/UNSAFE_TableRow.d.ts +20 -0
  75. package/lib/components/UNSAFE_Table/UNSAFE_TableRow/index.d.ts +3 -0
  76. package/lib/components/UNSAFE_Table/UNSAFE_TableRow/index.js +2 -0
  77. package/lib/components/UNSAFE_Table/constants.d.ts +29 -0
  78. package/lib/components/UNSAFE_Table/index.d.ts +19 -0
  79. package/lib/components/UNSAFE_Table/index.js +182 -0
  80. package/lib/components/UNSAFE_Table/index.js.map +1 -0
  81. package/lib/components/UNSAFE_Table/resourceHelper.d.ts +3 -0
  82. package/lib/components/UNSAFE_Table/styles.module.scss +621 -0
  83. package/lib/components/UNSAFE_Table/styles.module.scss.d.ts +62 -0
  84. package/lib/components/UNSAFE_Table/useTableExpandedRows.d.ts +12 -0
  85. package/lib/components/UNSAFE_Table/useTableShowMore.d.ts +25 -0
  86. package/lib/components/UNSAFE_Table/utils.d.ts +47 -0
  87. package/lib/constants3.js +42 -0
  88. package/lib/constants3.js.map +1 -0
  89. package/lib/floating-ui.react.js +2 -2
  90. package/lib/floating-ui.react.js.map +1 -1
  91. package/lib/hooks/useSort.d.ts +88 -0
  92. package/lib/hooks/useSort.js +91 -0
  93. package/lib/hooks/useSort.js.map +1 -0
  94. package/lib/hooks/useSort.test.js +11739 -0
  95. package/lib/hooks/useSort.test.js.map +1 -0
  96. package/lib/hooks/useSynchronousResizeObserver.d.ts +11 -0
  97. package/lib/hooks/useSynchronousResizeObserver.js +29 -0
  98. package/lib/hooks/useSynchronousResizeObserver.js.map +1 -0
  99. package/lib/resources/HN.Designsystem.Table.nb-NO.json.d.ts +9 -0
  100. package/lib/resources/Resources.d.ts +19 -0
  101. package/lib/rolldown-runtime.js +33 -0
  102. package/lib/scss/_font-mixins.scss +28 -1
  103. package/lib/scss/typography.module.scss +8 -0
  104. package/lib/scss/typography.module.scss.d.ts +2 -0
  105. package/lib/scss/typography.stories.tsx +8 -0
  106. package/lib/utils/uuid.js +1 -12
  107. package/lib/utils/uuid.js.map +1 -1
  108. package/package.json +54 -2
  109. package/scss/_font-mixins.scss +28 -1
  110. package/scss/typography.module.scss +8 -0
  111. package/scss/typography.module.scss.d.ts +2 -0
  112. package/scss/typography.stories.tsx +8 -0
@@ -0,0 +1,182 @@
1
+ import { LanguageLocales } from "../../constants.js";
2
+ import { useLanguage } from "../../hooks/useLanguage.js";
3
+ import { useBreakpoint } from "../../hooks/useBreakpoint.js";
4
+ import { useLayoutEvent } from "../../hooks/useLayoutEvent.js";
5
+ import { t as HorizontalScroll_default } from "../../HorizontalScroll.js";
6
+ import { a as TextAlign, i as TableSizes, n as SortDirection, o as defaultConfig, r as TableColors, t as ResponsiveTableVariant } from "../../constants3.js";
7
+ import { n as TableContext, r as HN_Designsystem_Table_nb_NO_default } from "../../TableContext.js";
8
+ import { t as UNSAFE_TableHead } from "../../UNSAFE_TableHead.js";
9
+ import { a as getCenteredOverflowTableStyle, c as getHiddenColumns, i as getBreakpointClass, l as omitProps, n as UNSAFE_TableHeadCell, o as getColumnHeadingTexts, r as getAvailableWidth, s as getCurrentConfig } from "../../UNSAFE_TableHeadCell.js";
10
+ import { useSynchronousResizeObserver } from "../../hooks/useSynchronousResizeObserver.js";
11
+ import { useSort } from "../../hooks/useSort.js";
12
+ import { t as UNSAFE_TableCell } from "../../UNSAFE_TableCell.js";
13
+ import { n as UNSAFE_TableRow } from "../../UNSAFE_TableRow.js";
14
+ import "./UNSAFE_TableCell/index.js";
15
+ import { n as UNSAFE_TableBody } from "../../UNSAFE_TableBody.js";
16
+ import "./UNSAFE_TableHead/index.js";
17
+ import classNames from "classnames";
18
+ import { useEffect, useId, useMemo, useRef, useState } from "react";
19
+ import { jsx, jsxs } from "react/jsx-runtime";
20
+ import styles from "./styles.module.scss";
21
+ //#region src/components/UNSAFE_Table/TableCaption.tsx
22
+ var TableCaption = ({ id, className, children }) => /* @__PURE__ */ jsx("caption", {
23
+ id,
24
+ className: classNames(styles["table-caption"], className),
25
+ children
26
+ });
27
+ //#endregion
28
+ //#region src/components/UNSAFE_Table/resourceHelper.ts
29
+ var getResources = (language) => {
30
+ switch (language) {
31
+ case LanguageLocales.NORWEGIAN:
32
+ default: return HN_Designsystem_Table_nb_NO_default;
33
+ }
34
+ };
35
+ //#endregion
36
+ //#region src/components/UNSAFE_Table/UNSAFE_Table.tsx
37
+ var UNSAFE_Table = ({ breakpointConfig = defaultConfig, caption, children, className, color, id, resources, size = TableSizes.normal, stackHeadWidth, testId, zebraStripes = false, ...rest }) => {
38
+ const captionElementId = useId();
39
+ const [tableWidth, setTableWidth] = useState(0);
40
+ const [parentWidth, setParentWidth] = useState(0);
41
+ const [windowWidth, setWindowWidth] = useState(document.documentElement.clientWidth || window.innerWidth);
42
+ const tableRef = useRef(null);
43
+ const breakpoint = useBreakpoint();
44
+ const { language } = useLanguage(LanguageLocales.NORWEGIAN);
45
+ const mergedResources = {
46
+ ...getResources(language),
47
+ ...resources
48
+ };
49
+ const currentConfig = useMemo(() => getCurrentConfig(breakpointConfig, breakpoint, tableWidth, windowWidth), [
50
+ breakpointConfig,
51
+ breakpoint,
52
+ tableWidth,
53
+ windowWidth
54
+ ]);
55
+ useSynchronousResizeObserver(tableRef, (tableElement, parentElement) => {
56
+ if (currentConfig?.variant !== ResponsiveTableVariant.stack) setTableWidth(tableElement.getBoundingClientRect().width);
57
+ const parentStyle = getComputedStyle(parentElement);
58
+ const horizontalSpacing = [
59
+ parentStyle.paddingLeft,
60
+ parentStyle.paddingRight,
61
+ parentStyle.borderLeftWidth,
62
+ parentStyle.borderRightWidth
63
+ ].reduce((total, value) => total + (Number.parseFloat(value) || 0), 0);
64
+ setParentWidth(Math.max(0, parentElement.getBoundingClientRect().width - horizontalSpacing));
65
+ setWindowWidth(getAvailableWidth(parentElement));
66
+ }, [currentConfig?.variant]);
67
+ useLayoutEvent(() => {
68
+ if (tableRef.current?.parentElement) setWindowWidth(getAvailableWidth(tableRef.current.parentElement));
69
+ }, ["resize"], 100);
70
+ const tableStyle = currentConfig?.variant === ResponsiveTableVariant.centeredoverflow || stackHeadWidth !== void 0 ? {
71
+ ...currentConfig?.variant === ResponsiveTableVariant.centeredoverflow ? getCenteredOverflowTableStyle(parentWidth, tableWidth) : void 0,
72
+ ...stackHeadWidth !== void 0 ? { "--table-stack-columns": `${stackHeadWidth}% minmax(0, 1fr)` } : void 0
73
+ } : void 0;
74
+ const breakpointClass = getBreakpointClass(currentConfig);
75
+ const tableClass = classNames(styles.table, breakpointClass, className);
76
+ const domRest = omitProps(rest, [
77
+ "breakpoint",
78
+ "variant",
79
+ "fallbackVariant",
80
+ "headerCategory"
81
+ ]);
82
+ const hiddenColumns = useMemo(() => getHiddenColumns(children), [children]);
83
+ const headingTexts = useMemo(() => getColumnHeadingTexts(children), [children]);
84
+ const tableContext = useMemo(() => ({
85
+ variant: currentConfig?.variant ?? ResponsiveTableVariant.normal,
86
+ color: color ?? TableColors.normal,
87
+ size,
88
+ zebraStripes,
89
+ hiddenColumns,
90
+ headingTexts,
91
+ resources: mergedResources
92
+ }), [
93
+ currentConfig?.variant,
94
+ color,
95
+ size,
96
+ zebraStripes,
97
+ hiddenColumns,
98
+ headingTexts
99
+ ]);
100
+ const table = /* @__PURE__ */ jsxs("table", {
101
+ className: tableClass,
102
+ id,
103
+ "data-testid": testId,
104
+ ref: tableRef,
105
+ style: tableStyle,
106
+ ...domRest,
107
+ children: [/* @__PURE__ */ jsx(TableCaption, {
108
+ id: captionElementId,
109
+ children: caption
110
+ }), children]
111
+ });
112
+ return /* @__PURE__ */ jsx(TableContext.Provider, {
113
+ value: tableContext,
114
+ children: currentConfig?.variant === ResponsiveTableVariant.horizontalscroll ? /* @__PURE__ */ jsx(HorizontalScroll_default, {
115
+ testId: "horizontal-scroll",
116
+ "aria-labelledby": captionElementId,
117
+ children: table
118
+ }) : table
119
+ });
120
+ };
121
+ //#endregion
122
+ //#region src/components/UNSAFE_Table/useTableExpandedRows.ts
123
+ /** Expanded state per row for tables with expandable rows (UNSAFE_TableRow expandedContent/hideBehindExpander). */
124
+ var useTableExpandedRows = () => {
125
+ const [expandedRows, setExpandedRows] = useState({});
126
+ const isExpanded = (rowKey) => !!expandedRows[rowKey];
127
+ const toggleExpanded = (rowKey) => {
128
+ setExpandedRows((prev) => ({
129
+ ...prev,
130
+ [rowKey]: !prev[rowKey]
131
+ }));
132
+ };
133
+ const collapseAll = () => {
134
+ setExpandedRows({});
135
+ };
136
+ return {
137
+ expandedRows,
138
+ isExpanded,
139
+ toggleExpanded,
140
+ collapseAll
141
+ };
142
+ };
143
+ //#endregion
144
+ //#region src/components/UNSAFE_Table/useTableShowMore.ts
145
+ /** Progressive disclosure ("show more") of table rows, with focus management when the show more button disappears. */
146
+ var useTableShowMore = ({ data, pageSize }) => {
147
+ const [visibleCount, setVisibleCount] = useState(pageSize);
148
+ const [newRowsStartIndex, setNewRowsStartIndex] = useState();
149
+ const firstNewRowRef = useRef(null);
150
+ const shouldFocusNewRow = useRef(false);
151
+ const visibleData = useMemo(() => visibleCount === void 0 ? data : data.slice(0, visibleCount), [data, visibleCount]);
152
+ const hasMore = visibleCount !== void 0 && visibleCount < data.length;
153
+ const showMore = () => {
154
+ if (visibleCount === void 0 || pageSize === void 0) return;
155
+ const newCount = Math.min(visibleCount + pageSize, data.length);
156
+ shouldFocusNewRow.current = newCount >= data.length;
157
+ setNewRowsStartIndex(visibleCount);
158
+ setVisibleCount(newCount);
159
+ };
160
+ useEffect(() => {
161
+ if (shouldFocusNewRow.current) {
162
+ shouldFocusNewRow.current = false;
163
+ firstNewRowRef.current?.focus();
164
+ }
165
+ }, [visibleCount]);
166
+ const reset = () => {
167
+ setVisibleCount(pageSize);
168
+ setNewRowsStartIndex(void 0);
169
+ };
170
+ return {
171
+ visibleData,
172
+ hasMore,
173
+ showMore,
174
+ reset,
175
+ newRowsStartIndex,
176
+ firstNewRowRef
177
+ };
178
+ };
179
+ //#endregion
180
+ export { ResponsiveTableVariant, SortDirection, TableCaption, TableColors, TableSizes, TextAlign, UNSAFE_Table, UNSAFE_Table as default, UNSAFE_TableBody, UNSAFE_TableCell, UNSAFE_TableHead, UNSAFE_TableHeadCell, UNSAFE_TableRow, defaultConfig, useSort, useTableExpandedRows, useTableShowMore };
181
+
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/UNSAFE_Table/TableCaption.tsx","../../../src/components/UNSAFE_Table/resourceHelper.ts","../../../src/components/UNSAFE_Table/UNSAFE_Table.tsx","../../../src/components/UNSAFE_Table/useTableExpandedRows.ts","../../../src/components/UNSAFE_Table/useTableShowMore.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport styles from './styles.module.scss';\n\nexport interface TableCaptionProps {\n /** Unique ID. Can be used with aria-labelledby, e.g. for the scroll container. */\n id?: string;\n /** Adds custom classes to the element. */\n className?: string;\n /** Sets the content of the caption. */\n children: React.ReactNode;\n}\n\nexport const TableCaption: React.FC<TableCaptionProps> = ({ id, className, children }) => (\n <caption id={id} className={classNames(styles['table-caption'], className)}>\n {children}\n </caption>\n);\n\nexport default TableCaption;\n","import type { HNDesignsystemTable } from '../../resources/Resources';\n\nimport { LanguageLocales } from '../../constants';\nimport nbNO from '../../resources/HN.Designsystem.Table.nb-NO.json';\n\nexport const getResources = (language: LanguageLocales): HNDesignsystemTable => {\n switch (language) {\n case LanguageLocales.NORWEGIAN:\n default:\n return nbNO;\n }\n};\n","import { useId, useMemo, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { TableContextValue } from './TableContext';\nimport type { HNDesignsystemTable } from '../../resources/Resources';\n\nimport { ResponsiveTableVariant, defaultConfig, TableColors, TableSizes } from './constants';\nimport { getResources } from './resourceHelper';\nimport TableCaption from './TableCaption';\nimport { TableContext } from './TableContext';\nimport {\n getAvailableWidth,\n getColumnHeadingTexts,\n getHiddenColumns,\n getBreakpointClass,\n getCenteredOverflowTableStyle,\n getCurrentConfig,\n omitProps,\n} from './utils';\nimport { LanguageLocales } from '../../constants';\nimport { useBreakpoint, type Breakpoint } from '../../hooks/useBreakpoint';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useLayoutEvent } from '../../hooks/useLayoutEvent';\nimport { useSynchronousResizeObserver } from '../../hooks/useSynchronousResizeObserver';\nimport HorizontalScroll from '../HorizontalScroll';\n\nimport styles from './styles.module.scss';\n\nexport interface BreakpointConfig {\n /** Breakpoint at which responsive behaviour will be applied. The table component uses a \"desktop first\" approach. */\n breakpoint: keyof typeof Breakpoint;\n /** Desired behaviour on this breakpoint and all smaller screens. */\n variant: keyof typeof ResponsiveTableVariant;\n /** If variant is horizontallscroll, use a fallback instead of device is not a touch device. */\n fallbackVariant?: keyof typeof ResponsiveTableVariant;\n}\n\nexport interface UNSAFE_TableProps extends Omit<React.ComponentPropsWithoutRef<'table'>, 'style'> {\n /** Customize how the table behaves on various screen widths */\n breakpointConfig?: BreakpointConfig | BreakpointConfig[];\n /** Description of the table for screen readers. Rendered as a visually hidden caption and used to label the scroll container. */\n caption: string;\n /** Sets the content of the table. Use TableHead and UNSAFE_TableBody */\n children: React.ReactNode;\n /** Adds custom classes to the element. */\n className?: string;\n /** Header category for styling. Default: normal */\n color?: TableColors;\n /** Unique ID */\n id?: string;\n /** Resources for component */\n resources?: Partial<HNDesignsystemTable>;\n /** For display with less space. Discouraged to use together with interactive elements. */\n size?: TableSizes;\n /** Width of the head column in percentage in the stack variant. When not set, the column follows the widest heading in the table, but wraps (minimum 30%) when the content needs the space. */\n stackHeadWidth?: number;\n /** Id used for testing */\n testId?: string;\n /** Applies zebra stripes to every other row. Default: false */\n zebraStripes?: boolean;\n}\n\nexport const UNSAFE_Table: React.FC<UNSAFE_TableProps> = ({\n breakpointConfig = defaultConfig,\n caption,\n children,\n className,\n color,\n id,\n resources,\n size = TableSizes.normal,\n stackHeadWidth,\n testId,\n zebraStripes = false,\n ...rest\n}) => {\n const captionElementId = useId();\n\n const [tableWidth, setTableWidth] = useState<number>(0);\n const [parentWidth, setParentWidth] = useState<number>(0);\n const [windowWidth, setWindowWidth] = useState(document.documentElement.clientWidth || window.innerWidth);\n const tableRef = useRef<HTMLTableElement>(null);\n const breakpoint = useBreakpoint();\n\n const { language } = useLanguage<LanguageLocales>(LanguageLocales.NORWEGIAN);\n const defaultResources = getResources(language);\n const mergedResources: HNDesignsystemTable = {\n ...defaultResources,\n ...resources,\n };\n\n const currentConfig = useMemo(\n () => getCurrentConfig(breakpointConfig, breakpoint, tableWidth, windowWidth),\n [breakpointConfig, breakpoint, tableWidth, windowWidth]\n );\n\n useSynchronousResizeObserver(\n tableRef,\n (tableElement, parentElement) => {\n if (currentConfig?.variant !== ResponsiveTableVariant.stack) {\n setTableWidth(tableElement.getBoundingClientRect().width);\n }\n const parentStyle = getComputedStyle(parentElement);\n const horizontalSpacing = [\n parentStyle.paddingLeft,\n parentStyle.paddingRight,\n parentStyle.borderLeftWidth,\n parentStyle.borderRightWidth,\n ].reduce((total, value) => total + (Number.parseFloat(value) || 0), 0);\n setParentWidth(Math.max(0, parentElement.getBoundingClientRect().width - horizontalSpacing));\n setWindowWidth(getAvailableWidth(parentElement));\n },\n [currentConfig?.variant]\n );\n\n useLayoutEvent(\n () => {\n if (tableRef.current?.parentElement) {\n setWindowWidth(getAvailableWidth(tableRef.current.parentElement));\n }\n },\n ['resize'],\n 100\n );\n\n const tableStyle: React.CSSProperties | undefined =\n currentConfig?.variant === ResponsiveTableVariant.centeredoverflow || stackHeadWidth !== undefined\n ? {\n ...(currentConfig?.variant === ResponsiveTableVariant.centeredoverflow\n ? getCenteredOverflowTableStyle(parentWidth, tableWidth)\n : undefined),\n ...(stackHeadWidth !== undefined ? { '--table-stack-columns': `${stackHeadWidth}% minmax(0, 1fr)` } : undefined),\n }\n : undefined;\n\n const breakpointClass = getBreakpointClass(currentConfig);\n const tableClass = classNames(styles.table, breakpointClass, className);\n const domRest = omitProps(rest as Record<string, unknown>, ['breakpoint', 'variant', 'fallbackVariant', 'headerCategory']);\n\n const hiddenColumns = useMemo(() => getHiddenColumns(children), [children]);\n const headingTexts = useMemo(() => getColumnHeadingTexts(children), [children]);\n\n const tableContext = useMemo<TableContextValue>(\n () => ({\n variant: currentConfig?.variant ?? ResponsiveTableVariant.normal,\n color: color ?? TableColors.normal,\n size,\n zebraStripes,\n hiddenColumns,\n headingTexts,\n resources: mergedResources,\n }),\n [currentConfig?.variant, color, size, zebraStripes, hiddenColumns, headingTexts]\n );\n\n const table = (\n <table className={tableClass} id={id} data-testid={testId} ref={tableRef} style={tableStyle} {...domRest}>\n <TableCaption id={captionElementId}>{caption}</TableCaption>\n {children}\n </table>\n );\n\n return (\n <TableContext.Provider value={tableContext}>\n {currentConfig?.variant === ResponsiveTableVariant.horizontalscroll ? (\n <HorizontalScroll testId=\"horizontal-scroll\" aria-labelledby={captionElementId}>\n {table}\n </HorizontalScroll>\n ) : (\n table\n )}\n </TableContext.Provider>\n );\n};\n\nexport default UNSAFE_Table;\n","import { useState } from 'react';\n\nexport interface UseTableExpandedRowsReturn {\n /** Current expanded state per row key */\n expandedRows: Record<string, boolean>;\n /** Whether a row is expanded */\n isExpanded: (rowKey: string) => boolean;\n /** Toggle the expanded state of a row */\n toggleExpanded: (rowKey: string) => void;\n /** Collapse all rows, e.g. when the table is re-sorted */\n collapseAll: () => void;\n}\n\n/** Expanded state per row for tables with expandable rows (UNSAFE_TableRow expandedContent/hideBehindExpander). */\nexport const useTableExpandedRows = (): UseTableExpandedRowsReturn => {\n const [expandedRows, setExpandedRows] = useState<Record<string, boolean>>({});\n\n const isExpanded = (rowKey: string): boolean => !!expandedRows[rowKey];\n\n const toggleExpanded = (rowKey: string): void => {\n setExpandedRows(prev => ({ ...prev, [rowKey]: !prev[rowKey] }));\n };\n\n const collapseAll = (): void => {\n setExpandedRows({});\n };\n\n return { expandedRows, isExpanded, toggleExpanded, collapseAll };\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nexport interface UseTableShowMoreOptions<TData> {\n /** All rows */\n data: TData[];\n /** Number of rows to show initially and to reveal per showMore(). Shows all rows when not set. */\n pageSize?: number;\n}\n\nexport interface UseTableShowMoreReturn<TData, TElement extends HTMLElement> {\n /** The rows that are currently visible */\n visibleData: TData[];\n /** Whether there are more rows to show */\n hasMore: boolean;\n /** Reveal the next page of rows */\n showMore: () => void;\n /** Reset to the initial number of visible rows */\n reset: () => void;\n /** Index of the first row revealed by the last showMore() call */\n newRowsStartIndex?: number;\n /**\n * Attach to a focusable element in the first newly revealed row (index === newRowsStartIndex).\n * The element receives focus when the last page is revealed and the show more button disappears.\n */\n firstNewRowRef: React.RefObject<TElement | null>;\n}\n\n/** Progressive disclosure (\"show more\") of table rows, with focus management when the show more button disappears. */\nexport const useTableShowMore = <TData, TElement extends HTMLElement = HTMLElement>({\n data,\n pageSize,\n}: UseTableShowMoreOptions<TData>): UseTableShowMoreReturn<TData, TElement> => {\n const [visibleCount, setVisibleCount] = useState(pageSize);\n const [newRowsStartIndex, setNewRowsStartIndex] = useState<number>();\n const firstNewRowRef = useRef<TElement>(null);\n const shouldFocusNewRow = useRef(false);\n\n const visibleData = useMemo(() => (visibleCount === undefined ? data : data.slice(0, visibleCount)), [data, visibleCount]);\n const hasMore = visibleCount !== undefined && visibleCount < data.length;\n\n const showMore = (): void => {\n if (visibleCount === undefined || pageSize === undefined) {\n return;\n }\n const newCount = Math.min(visibleCount + pageSize, data.length);\n // Flytt fokus når \"vis mer\"-knappen forsvinner, slik at fokus ikke går tapt\n shouldFocusNewRow.current = newCount >= data.length;\n setNewRowsStartIndex(visibleCount);\n setVisibleCount(newCount);\n };\n\n useEffect(() => {\n if (shouldFocusNewRow.current) {\n shouldFocusNewRow.current = false;\n firstNewRowRef.current?.focus();\n }\n }, [visibleCount]);\n\n const reset = (): void => {\n setVisibleCount(pageSize);\n setNewRowsStartIndex(undefined);\n };\n\n return { visibleData, hasMore, showMore, reset, newRowsStartIndex, firstNewRowRef };\n};\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { HNDesignsystemTable } from '../../resources/Resources';
2
+ import { LanguageLocales } from '../../constants';
3
+ export declare const getResources: (language: LanguageLocales) => HNDesignsystemTable;