@valu/block-components 0.1.1 → 0.2.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/dist/index.cjs CHANGED
@@ -2029,6 +2029,729 @@ var ContentPicker = ({
2029
2029
  ] }) }) });
2030
2030
  };
2031
2031
 
2032
+ // components/matrix/styles/tokens.ts
2033
+ var tokens2 = {
2034
+ accent: "var(--wp-admin-theme-color, #3858e9)",
2035
+ accentHover: "color-mix(in srgb, var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9)) 4%, transparent)",
2036
+ bg: "var(--wp-components-color-background, #ffffff)",
2037
+ bgMuted: "var(--wp-components-color-gray-100, #f0f0f0)",
2038
+ fg: "var(--wp-components-color-foreground, #1e1e1e)",
2039
+ gray200: "var(--wp-components-color-gray-200, #ebebeb)",
2040
+ gray300: "var(--wp-components-color-gray-300, #dcdcde)",
2041
+ gray600: "var(--wp-components-color-gray-600, #757575)",
2042
+ gray900: "var(--wp-components-color-gray-900, #1e1e1e)",
2043
+ radiusSm: "2px",
2044
+ radiusMd: "4px",
2045
+ rowMinHeight: "44px",
2046
+ shadowStickyTop: "inset 0 -1px 0 rgba(0, 0, 0, 0.08)",
2047
+ shadowStickyLeft: "inset -1px 0 0 rgba(0, 0, 0, 0.08)",
2048
+ spaceXs: "4px",
2049
+ spaceSm: "8px",
2050
+ spaceMd: "12px",
2051
+ transitionFast: "120ms ease-out",
2052
+ fontSizeBody: "13px",
2053
+ fontSizeSmall: "11px",
2054
+ fontWeightRegular: 400,
2055
+ fontWeightMedium: 500,
2056
+ fontWeightBold: 600,
2057
+ /** Sticky z-index layering. Row-header > master > top headers > leaf cells. */
2058
+ zRowHeader: 4,
2059
+ zMaster: 3,
2060
+ zHeader: 3};
2061
+
2062
+ // components/matrix/styles/index.ts
2063
+ var visuallyHiddenCss2 = react.css`
2064
+ position: absolute !important;
2065
+ clip: rect(1px, 1px, 1px, 1px);
2066
+ width: 1px;
2067
+ height: 1px;
2068
+ overflow: hidden;
2069
+ white-space: nowrap;
2070
+ `;
2071
+ var Root2 = styled__default.default.div`
2072
+ color: ${tokens2.fg};
2073
+ font-size: ${tokens2.fontSizeBody};
2074
+
2075
+ * {
2076
+ box-sizing: border-box;
2077
+ }
2078
+ `;
2079
+ var Viewport = styled__default.default.div`
2080
+ position: relative;
2081
+ overflow: auto;
2082
+ max-height: ${(p) => p.$maxHeight};
2083
+ border: 1px solid ${tokens2.gray300};
2084
+ border-radius: ${tokens2.radiusMd};
2085
+ background: ${tokens2.bg};
2086
+ `;
2087
+ var Table = styled__default.default.table`
2088
+ border-collapse: separate;
2089
+ border-spacing: 0;
2090
+ width: 100%;
2091
+ min-width: max-content;
2092
+
2093
+ caption {
2094
+ ${visuallyHiddenCss2};
2095
+ }
2096
+
2097
+ th,
2098
+ td {
2099
+ text-align: left;
2100
+ padding: ${tokens2.spaceSm} ${tokens2.spaceMd};
2101
+ border-bottom: 1px solid ${tokens2.gray200};
2102
+ font-weight: ${tokens2.fontWeightRegular};
2103
+ vertical-align: middle;
2104
+ background: ${tokens2.bg};
2105
+ }
2106
+
2107
+ tbody tr:last-of-type th,
2108
+ tbody tr:last-of-type td {
2109
+ border-bottom: none;
2110
+ }
2111
+
2112
+ tbody tr:hover th,
2113
+ tbody tr:hover td {
2114
+ background: ${tokens2.bgMuted};
2115
+ }
2116
+ `;
2117
+ var HeaderCell = styled__default.default.th`
2118
+ font-weight: ${tokens2.fontWeightBold};
2119
+ font-size: ${tokens2.fontSizeSmall};
2120
+ text-transform: uppercase;
2121
+ letter-spacing: 0.02em;
2122
+ color: ${tokens2.gray900};
2123
+ white-space: nowrap;
2124
+ text-align: ${(p) => p.$align ?? "left"};
2125
+
2126
+ ${(p) => p.$sticky && react.css`
2127
+ position: sticky;
2128
+ top: ${p.$top ?? "0"};
2129
+ z-index: ${p.$z ?? tokens2.zHeader};
2130
+ box-shadow: ${tokens2.shadowStickyTop};
2131
+ `};
2132
+
2133
+ ${(p) => p.$leftSticky && react.css`
2134
+ position: sticky;
2135
+ left: ${p.$leftOffset ?? "0"};
2136
+ z-index: ${(p.$z ?? tokens2.zHeader) + 1};
2137
+ box-shadow: ${tokens2.shadowStickyLeft}, ${tokens2.shadowStickyTop};
2138
+ `};
2139
+ `;
2140
+ var GroupHeaderButton = styled__default.default.button`
2141
+ display: inline-flex;
2142
+ align-items: center;
2143
+ gap: ${tokens2.spaceXs};
2144
+ background: transparent;
2145
+ border: 1px solid transparent;
2146
+ border-radius: ${tokens2.radiusSm};
2147
+ padding: 2px ${tokens2.spaceXs};
2148
+ font: inherit;
2149
+ color: inherit;
2150
+ cursor: pointer;
2151
+ text-transform: inherit;
2152
+ letter-spacing: inherit;
2153
+
2154
+ &:hover {
2155
+ background: ${tokens2.accentHover};
2156
+ }
2157
+
2158
+ &:focus-visible {
2159
+ outline: 2px solid ${tokens2.accent};
2160
+ outline-offset: 1px;
2161
+ }
2162
+
2163
+ &[disabled] {
2164
+ cursor: default;
2165
+ &:hover {
2166
+ background: transparent;
2167
+ }
2168
+ }
2169
+ `;
2170
+ var Caret = styled__default.default.span`
2171
+ display: inline-block;
2172
+ width: 0;
2173
+ height: 0;
2174
+ border-left: 4px solid transparent;
2175
+ border-right: 4px solid transparent;
2176
+ border-top: 5px solid currentColor;
2177
+ transition: transform ${tokens2.transitionFast};
2178
+ transform: ${(p) => p.$open ? "rotate(0deg)" : "rotate(-90deg)"};
2179
+ `;
2180
+ var RowHeaderCell = styled__default.default.th`
2181
+ min-width: 220px;
2182
+ max-width: 320px;
2183
+ ${(p) => p.$leftSticky && react.css`
2184
+ position: sticky;
2185
+ left: 0;
2186
+ z-index: ${tokens2.zRowHeader};
2187
+ box-shadow: ${tokens2.shadowStickyLeft};
2188
+ `};
2189
+ `;
2190
+ var RowHeaderInner = styled__default.default.div`
2191
+ display: flex;
2192
+ align-items: center;
2193
+ gap: ${tokens2.spaceMd};
2194
+ min-height: ${tokens2.rowMinHeight};
2195
+ `;
2196
+ var RowHeaderText = styled__default.default.div`
2197
+ display: flex;
2198
+ flex-direction: column;
2199
+ gap: 2px;
2200
+ min-width: 0;
2201
+ `;
2202
+ var RowLabel = styled__default.default.div`
2203
+ font-weight: ${tokens2.fontWeightMedium};
2204
+ color: ${tokens2.gray900};
2205
+ overflow: hidden;
2206
+ text-overflow: ellipsis;
2207
+ `;
2208
+ var RowSublabel = styled__default.default.div`
2209
+ color: ${tokens2.gray600};
2210
+ font-size: ${tokens2.fontSizeSmall};
2211
+ overflow: hidden;
2212
+ text-overflow: ellipsis;
2213
+ `;
2214
+ var RowMeta = styled__default.default.div`
2215
+ display: flex;
2216
+ flex-wrap: wrap;
2217
+ gap: ${tokens2.spaceXs};
2218
+ margin-left: auto;
2219
+ `;
2220
+ var MasterCell = styled__default.default.td`
2221
+ min-width: 96px;
2222
+ text-align: center;
2223
+ ${(p) => p.$leftSticky && react.css`
2224
+ position: sticky;
2225
+ left: ${p.$leftOffset};
2226
+ z-index: ${tokens2.zMaster};
2227
+ box-shadow: ${tokens2.shadowStickyLeft};
2228
+ `};
2229
+ `;
2230
+ var LeafCell = styled__default.default.td`
2231
+ min-width: 88px;
2232
+ text-align: center;
2233
+
2234
+ &[data-disabled='true'] {
2235
+ opacity: 0.45;
2236
+ }
2237
+ `;
2238
+ var SummaryCell = styled__default.default.td`
2239
+ min-width: 88px;
2240
+ text-align: center;
2241
+ color: ${tokens2.gray600};
2242
+ font-variant-numeric: tabular-nums;
2243
+ `;
2244
+ var FillerCell = styled__default.default.td`
2245
+ width: 100%;
2246
+ padding: 0;
2247
+ `;
2248
+ var FillerHeaderCell = styled__default.default.th`
2249
+ width: 100%;
2250
+ padding: 0;
2251
+
2252
+ ${(p) => p.$sticky && react.css`
2253
+ position: sticky;
2254
+ top: 0;
2255
+ z-index: ${tokens2.zHeader};
2256
+ background: ${tokens2.bg};
2257
+ box-shadow: ${tokens2.shadowStickyTop};
2258
+ `};
2259
+ `;
2260
+ var CellControlWrap = styled__default.default.div`
2261
+ display: inline-flex;
2262
+ align-items: center;
2263
+ justify-content: center;
2264
+
2265
+ /* Trim @wordpress/components default vertical margins inside table cells. */
2266
+ .components-checkbox-control,
2267
+ .components-toggle-control,
2268
+ .components-base-control,
2269
+ .components-base-control__field {
2270
+ margin: 0;
2271
+ }
2272
+
2273
+ .components-checkbox-control__input-container {
2274
+ margin: 0;
2275
+ }
2276
+ `;
2277
+ var Caption = styled__default.default.caption`
2278
+ ${visuallyHiddenCss2};
2279
+ `;
2280
+ var isExpanded = (group, expanded) => group.collapsible === false ? true : expanded.has(group.id);
2281
+ var MatrixHeader = ({
2282
+ groups,
2283
+ master,
2284
+ flat,
2285
+ stickyHeader,
2286
+ stickyFirstColumn,
2287
+ masterLeftOffset,
2288
+ expandedGroups,
2289
+ onToggleGroup,
2290
+ labels,
2291
+ renderHeader,
2292
+ rowHeaderLabel
2293
+ }) => {
2294
+ if (flat) {
2295
+ const cols = groups[0]?.columns ?? [];
2296
+ return /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2297
+ /* @__PURE__ */ jsxRuntime.jsx(
2298
+ HeaderCell,
2299
+ {
2300
+ scope: "col",
2301
+ $sticky: stickyHeader,
2302
+ $leftSticky: stickyFirstColumn,
2303
+ $leftOffset: "0",
2304
+ children: rowHeaderLabel ?? ""
2305
+ }
2306
+ ),
2307
+ master && /* @__PURE__ */ jsxRuntime.jsx(
2308
+ HeaderCell,
2309
+ {
2310
+ scope: "col",
2311
+ $sticky: stickyHeader,
2312
+ $leftSticky: stickyFirstColumn,
2313
+ $leftOffset: masterLeftOffset,
2314
+ $align: "center",
2315
+ children: master.label
2316
+ }
2317
+ ),
2318
+ cols.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
2319
+ HeaderCell,
2320
+ {
2321
+ scope: "col",
2322
+ $sticky: stickyHeader,
2323
+ $align: "center",
2324
+ "aria-description": col.description,
2325
+ children: renderHeader ? renderHeader(col) : col.label
2326
+ },
2327
+ col.id
2328
+ )),
2329
+ /* @__PURE__ */ jsxRuntime.jsx(FillerHeaderCell, { "aria-hidden": true, $sticky: stickyHeader })
2330
+ ] }) });
2331
+ }
2332
+ const TOP_ROW_HEIGHT = "36px";
2333
+ return /* @__PURE__ */ jsxRuntime.jsxs("thead", { children: [
2334
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2335
+ /* @__PURE__ */ jsxRuntime.jsx(
2336
+ HeaderCell,
2337
+ {
2338
+ scope: "col",
2339
+ rowSpan: 2,
2340
+ $sticky: stickyHeader,
2341
+ $leftSticky: stickyFirstColumn,
2342
+ $leftOffset: "0",
2343
+ children: rowHeaderLabel ?? ""
2344
+ }
2345
+ ),
2346
+ master && /* @__PURE__ */ jsxRuntime.jsx(
2347
+ HeaderCell,
2348
+ {
2349
+ scope: "col",
2350
+ rowSpan: 2,
2351
+ $sticky: stickyHeader,
2352
+ $leftSticky: stickyFirstColumn,
2353
+ $leftOffset: masterLeftOffset,
2354
+ $align: "center",
2355
+ children: master.label
2356
+ }
2357
+ ),
2358
+ groups.map((group) => {
2359
+ const open = isExpanded(group, expandedGroups);
2360
+ const span = open ? group.columns.length : 1;
2361
+ const collapsible = group.collapsible !== false;
2362
+ return /* @__PURE__ */ jsxRuntime.jsx(
2363
+ HeaderCell,
2364
+ {
2365
+ scope: "colgroup",
2366
+ colSpan: span,
2367
+ rowSpan: open ? 1 : 2,
2368
+ $sticky: stickyHeader,
2369
+ $align: "center",
2370
+ children: collapsible ? /* @__PURE__ */ jsxRuntime.jsxs(
2371
+ GroupHeaderButton,
2372
+ {
2373
+ type: "button",
2374
+ "aria-expanded": open,
2375
+ "aria-label": open ? labels.collapseGroup : labels.expandGroup,
2376
+ onClick: () => onToggleGroup(group.id),
2377
+ children: [
2378
+ /* @__PURE__ */ jsxRuntime.jsx(Caret, { $open: open, "aria-hidden": true }),
2379
+ group.label
2380
+ ]
2381
+ }
2382
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { children: group.label })
2383
+ },
2384
+ group.id
2385
+ );
2386
+ }),
2387
+ /* @__PURE__ */ jsxRuntime.jsx(FillerHeaderCell, { "aria-hidden": true, rowSpan: 2, $sticky: stickyHeader })
2388
+ ] }),
2389
+ /* @__PURE__ */ jsxRuntime.jsx("tr", { children: groups.map((group) => {
2390
+ const open = isExpanded(group, expandedGroups);
2391
+ if (!open) return null;
2392
+ return group.columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
2393
+ HeaderCell,
2394
+ {
2395
+ scope: "col",
2396
+ $sticky: stickyHeader,
2397
+ $top: TOP_ROW_HEIGHT,
2398
+ $align: "center",
2399
+ "aria-description": col.description,
2400
+ children: renderHeader ? renderHeader(col) : col.label
2401
+ },
2402
+ `${group.id}::${col.id}`
2403
+ ));
2404
+ }) })
2405
+ ] });
2406
+ };
2407
+
2408
+ // components/matrix/utils.ts
2409
+ var cellKey = (rowId, colId) => `${rowId}::${colId}`;
2410
+ var selectionByRow = (value, rowId) => {
2411
+ const prefix = `${rowId}::`;
2412
+ const out = [];
2413
+ for (const key of value) {
2414
+ if (key.startsWith(prefix)) out.push(key.slice(prefix.length));
2415
+ }
2416
+ return out;
2417
+ };
2418
+ var toggleCell = (value, rowId, colId, checked) => {
2419
+ const next = new Set(value);
2420
+ if (checked) next.add(cellKey(rowId, colId));
2421
+ else next.delete(cellKey(rowId, colId));
2422
+ return next;
2423
+ };
2424
+ var normalizeGroups = (input) => {
2425
+ if (input.groups) return { groups: input.groups, flat: false };
2426
+ return {
2427
+ groups: [
2428
+ {
2429
+ id: "__flat__",
2430
+ label: "",
2431
+ columns: input.columns ?? [],
2432
+ collapsible: false,
2433
+ defaultExpanded: true
2434
+ }
2435
+ ],
2436
+ flat: true
2437
+ };
2438
+ };
2439
+ var defaultLabels = (overrides = {}) => ({
2440
+ expandGroup: overrides.expandGroup ?? "Expand group",
2441
+ collapseGroup: overrides.collapseGroup ?? "Collapse group",
2442
+ groupSummary: overrides.groupSummary ?? ((selected, total) => `${selected} / ${total}`),
2443
+ cellToggled: overrides.cellToggled ?? ((rowLabel, colLabel, checked) => checked ? `${colLabel} added to ${rowLabel}` : `${colLabel} removed from ${rowLabel}`)
2444
+ });
2445
+ var toPlainText = (node) => {
2446
+ if (node === null || node === void 0 || node === false || node === true) return "";
2447
+ if (typeof node === "string" || typeof node === "number") return String(node);
2448
+ if (Array.isArray(node)) return node.map(toPlainText).join(" ");
2449
+ if (typeof node === "object" && "props" in node) {
2450
+ const props = node.props;
2451
+ if (props && "children" in props) return toPlainText(props.children);
2452
+ }
2453
+ return "";
2454
+ };
2455
+ var MatrixCell = ({
2456
+ row,
2457
+ column,
2458
+ value,
2459
+ disabled,
2460
+ variant,
2461
+ onChange,
2462
+ renderCell
2463
+ }) => {
2464
+ const key = cellKey(row.id, column.id);
2465
+ const checked = value.has(key);
2466
+ const toggle = react$1.useCallback(
2467
+ (nextChecked) => {
2468
+ if (disabled) return;
2469
+ const next = toggleCell(value, row.id, column.id, nextChecked);
2470
+ onChange(next, { rowId: row.id, colId: column.id, checked: nextChecked });
2471
+ },
2472
+ [column.id, disabled, onChange, row.id, value]
2473
+ );
2474
+ const ariaLabel = `${toPlainText(row.label)} \u2014 ${toPlainText(column.label)}`;
2475
+ const content = renderCell ? renderCell({ row, column, checked, disabled, toggle, selectionKey: key }) : variant === "toggle" ? /* @__PURE__ */ jsxRuntime.jsx(
2476
+ components.ToggleControl,
2477
+ {
2478
+ __nextHasNoMarginBottom: true,
2479
+ label: "",
2480
+ checked,
2481
+ disabled,
2482
+ "aria-label": ariaLabel,
2483
+ onChange: toggle
2484
+ }
2485
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
2486
+ components.CheckboxControl,
2487
+ {
2488
+ __nextHasNoMarginBottom: true,
2489
+ label: "",
2490
+ checked,
2491
+ disabled,
2492
+ "aria-label": ariaLabel,
2493
+ onChange: toggle
2494
+ }
2495
+ );
2496
+ return /* @__PURE__ */ jsxRuntime.jsx(LeafCell, { "data-disabled": disabled || void 0, children: /* @__PURE__ */ jsxRuntime.jsx(CellControlWrap, { children: content }) });
2497
+ };
2498
+ var MatrixGroupSummary = ({ ctx, labels, render }) => {
2499
+ if (render) return /* @__PURE__ */ jsxRuntime.jsx(SummaryCell, { children: render(ctx) });
2500
+ return /* @__PURE__ */ jsxRuntime.jsx(SummaryCell, { children: labels.groupSummary(ctx.selectedCount, ctx.totalCount) });
2501
+ };
2502
+ var isGroupExpanded = (group, expanded) => group.collapsible === false ? true : expanded.has(group.id);
2503
+ var countSelected = (value, rowId, cols) => {
2504
+ let n = 0;
2505
+ for (const c of cols) if (value.has(cellKey(rowId, c.id))) n += 1;
2506
+ return n;
2507
+ };
2508
+ var MatrixRowView = ({
2509
+ row,
2510
+ groups,
2511
+ master,
2512
+ flat,
2513
+ value,
2514
+ expandedGroups,
2515
+ stickyFirstColumn,
2516
+ masterLeftOffset,
2517
+ variant,
2518
+ onChange,
2519
+ labels,
2520
+ renderCell,
2521
+ renderRowHeader,
2522
+ renderGroupSummary
2523
+ }) => {
2524
+ const masterChecked = master ? value.has(cellKey(row.id, master.id)) : true;
2525
+ const masterDisablesRow = master ? master.disablesRow !== false : false;
2526
+ const rowDisabled = master ? masterDisablesRow && !masterChecked : false;
2527
+ const toggleMaster = react$1.useCallback(
2528
+ (checked) => {
2529
+ if (!master) return;
2530
+ const next = toggleCell(value, row.id, master.id, checked);
2531
+ onChange(next, { rowId: row.id, colId: master.id, checked });
2532
+ },
2533
+ [master, onChange, row.id, value]
2534
+ );
2535
+ return /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
2536
+ /* @__PURE__ */ jsxRuntime.jsx(RowHeaderCell, { scope: "row", $leftSticky: stickyFirstColumn, children: renderRowHeader ? renderRowHeader(row) : /* @__PURE__ */ jsxRuntime.jsxs(RowHeaderInner, { children: [
2537
+ row.avatar,
2538
+ /* @__PURE__ */ jsxRuntime.jsxs(RowHeaderText, { children: [
2539
+ /* @__PURE__ */ jsxRuntime.jsx(RowLabel, { children: row.label }),
2540
+ row.sublabel && /* @__PURE__ */ jsxRuntime.jsx(RowSublabel, { children: row.sublabel })
2541
+ ] }),
2542
+ row.meta && /* @__PURE__ */ jsxRuntime.jsx(RowMeta, { children: row.meta })
2543
+ ] }) }),
2544
+ master && /* @__PURE__ */ jsxRuntime.jsx(MasterCell, { $leftSticky: stickyFirstColumn, $leftOffset: masterLeftOffset, children: /* @__PURE__ */ jsxRuntime.jsx(CellControlWrap, { children: /* @__PURE__ */ jsxRuntime.jsx(
2545
+ components.ToggleControl,
2546
+ {
2547
+ __nextHasNoMarginBottom: true,
2548
+ label: "",
2549
+ checked: masterChecked,
2550
+ "aria-label": `${toPlainText(master.label)} \u2014 ${toPlainText(row.label)}`,
2551
+ onChange: toggleMaster
2552
+ }
2553
+ ) }) }),
2554
+ flat ? groups[0].columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
2555
+ MatrixCell,
2556
+ {
2557
+ row,
2558
+ column: col,
2559
+ value,
2560
+ disabled: rowDisabled,
2561
+ variant,
2562
+ onChange,
2563
+ renderCell
2564
+ },
2565
+ col.id
2566
+ )) : groups.flatMap((group) => {
2567
+ const open = isGroupExpanded(group, expandedGroups);
2568
+ if (!open) {
2569
+ return [
2570
+ /* @__PURE__ */ jsxRuntime.jsx(
2571
+ MatrixGroupSummary,
2572
+ {
2573
+ ctx: {
2574
+ row,
2575
+ group,
2576
+ selectedCount: countSelected(value, row.id, group.columns),
2577
+ totalCount: group.columns.length
2578
+ },
2579
+ labels,
2580
+ render: renderGroupSummary
2581
+ },
2582
+ group.id
2583
+ )
2584
+ ];
2585
+ }
2586
+ return group.columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
2587
+ MatrixCell,
2588
+ {
2589
+ row,
2590
+ column: col,
2591
+ value,
2592
+ disabled: rowDisabled,
2593
+ variant,
2594
+ onChange,
2595
+ renderCell
2596
+ },
2597
+ `${group.id}::${col.id}`
2598
+ ));
2599
+ }),
2600
+ /* @__PURE__ */ jsxRuntime.jsx(FillerCell, { "aria-hidden": true })
2601
+ ] });
2602
+ };
2603
+ var EmotionCacheProvider2 = ({ children }) => {
2604
+ const [head, setHead] = react$1.useState(null);
2605
+ const captureDocument = react$1.useCallback((node) => {
2606
+ if (!node) return;
2607
+ const owner = node.ownerDocument ?? document;
2608
+ setHead((prev) => prev === owner.head ? prev : owner.head);
2609
+ }, []);
2610
+ const cache = react$1.useMemo(() => {
2611
+ if (!head) return null;
2612
+ return createCache__default.default({ key: "valu-mx", container: head, prepend: true });
2613
+ }, [head]);
2614
+ if (!cache) {
2615
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: captureDocument, style: { display: "contents" } });
2616
+ }
2617
+ return /* @__PURE__ */ jsxRuntime.jsx(react.CacheProvider, { value: cache, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: captureDocument, style: { display: "contents" }, children }) });
2618
+ };
2619
+ var useExpandedGroups = ({
2620
+ expanded: controlled,
2621
+ defaultExpanded,
2622
+ onChange
2623
+ }) => {
2624
+ const [uncontrolled, setUncontrolled] = react$1.useState(
2625
+ () => defaultExpanded ?? /* @__PURE__ */ new Set()
2626
+ );
2627
+ const isControlled = controlled !== void 0;
2628
+ const expanded = isControlled ? controlled : uncontrolled;
2629
+ const apply = react$1.useCallback(
2630
+ (next) => {
2631
+ if (!isControlled) setUncontrolled(next);
2632
+ onChange?.(next);
2633
+ },
2634
+ [isControlled, onChange]
2635
+ );
2636
+ const isExpanded2 = react$1.useCallback((groupId) => expanded.has(groupId), [expanded]);
2637
+ const toggle = react$1.useCallback(
2638
+ (groupId) => {
2639
+ const next = new Set(expanded);
2640
+ if (next.has(groupId)) next.delete(groupId);
2641
+ else next.add(groupId);
2642
+ apply(next);
2643
+ },
2644
+ [apply, expanded]
2645
+ );
2646
+ const expand = react$1.useCallback(
2647
+ (groupId) => {
2648
+ if (expanded.has(groupId)) return;
2649
+ const next = new Set(expanded);
2650
+ next.add(groupId);
2651
+ apply(next);
2652
+ },
2653
+ [apply, expanded]
2654
+ );
2655
+ const collapse = react$1.useCallback(
2656
+ (groupId) => {
2657
+ if (!expanded.has(groupId)) return;
2658
+ const next = new Set(expanded);
2659
+ next.delete(groupId);
2660
+ apply(next);
2661
+ },
2662
+ [apply, expanded]
2663
+ );
2664
+ return { expanded, isExpanded: isExpanded2, toggle, expand, collapse };
2665
+ };
2666
+ var DEFAULT_MAX_HEIGHT = "calc(100vh - 260px)";
2667
+ var Matrix = (props) => {
2668
+ const {
2669
+ rows,
2670
+ master,
2671
+ value,
2672
+ onChange,
2673
+ expanded,
2674
+ defaultExpanded,
2675
+ onExpandedChange,
2676
+ variant = "checkbox",
2677
+ renderCell,
2678
+ renderRowHeader,
2679
+ renderGroupSummary,
2680
+ renderHeader,
2681
+ stickyHeader = true,
2682
+ stickyFirstColumn = true,
2683
+ rowHeaderWidth = 220,
2684
+ maxHeight = DEFAULT_MAX_HEIGHT,
2685
+ caption,
2686
+ labels,
2687
+ className,
2688
+ id
2689
+ } = props;
2690
+ const reactId = react$1.useId();
2691
+ const rootId = id ?? `valu-mx-${reactId.replace(/:/g, "")}`;
2692
+ const { groups, flat } = react$1.useMemo(
2693
+ () => normalizeGroups({ columns: props.columns, groups: props.groups }),
2694
+ [props.columns, props.groups]
2695
+ );
2696
+ const resolvedLabels = react$1.useMemo(() => defaultLabels(labels), [labels]);
2697
+ const { expanded: expandedGroups, toggle: toggleGroup } = useExpandedGroups({
2698
+ expanded,
2699
+ defaultExpanded,
2700
+ onChange: onExpandedChange
2701
+ });
2702
+ const maxHeightCss = typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight;
2703
+ const cssLength = (v) => typeof v === "number" ? `${v}px` : v;
2704
+ const rowHeaderWidthCss = cssLength(rowHeaderWidth);
2705
+ const masterWidthCss = master ? cssLength(master.width ?? 96) : "0";
2706
+ const masterLeftOffset = rowHeaderWidthCss;
2707
+ return /* @__PURE__ */ jsxRuntime.jsx(EmotionCacheProvider2, { children: /* @__PURE__ */ jsxRuntime.jsx(Root2, { id: rootId, className, children: /* @__PURE__ */ jsxRuntime.jsx(Viewport, { $maxHeight: maxHeightCss, children: /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
2708
+ caption && /* @__PURE__ */ jsxRuntime.jsx(Caption, { children: caption }),
2709
+ /* @__PURE__ */ jsxRuntime.jsxs("colgroup", { children: [
2710
+ /* @__PURE__ */ jsxRuntime.jsx("col", { style: { width: rowHeaderWidthCss } }),
2711
+ master && /* @__PURE__ */ jsxRuntime.jsx("col", { style: { width: masterWidthCss } })
2712
+ ] }),
2713
+ /* @__PURE__ */ jsxRuntime.jsx(
2714
+ MatrixHeader,
2715
+ {
2716
+ groups,
2717
+ master,
2718
+ flat,
2719
+ stickyHeader,
2720
+ stickyFirstColumn,
2721
+ masterLeftOffset,
2722
+ expandedGroups,
2723
+ onToggleGroup: toggleGroup,
2724
+ labels: resolvedLabels,
2725
+ renderHeader
2726
+ }
2727
+ ),
2728
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row) => /* @__PURE__ */ jsxRuntime.jsx(
2729
+ MatrixRowView,
2730
+ {
2731
+ row,
2732
+ groups,
2733
+ master,
2734
+ flat,
2735
+ value,
2736
+ expandedGroups,
2737
+ stickyFirstColumn,
2738
+ masterLeftOffset,
2739
+ variant,
2740
+ onChange,
2741
+ labels: resolvedLabels,
2742
+ renderCell,
2743
+ renderRowHeader,
2744
+ renderGroupSummary
2745
+ },
2746
+ row.id
2747
+ )) })
2748
+ ] }) }) }) });
2749
+ };
2750
+
2032
2751
  exports.ContentPicker = ContentPicker;
2752
+ exports.Matrix = Matrix;
2753
+ exports.cellKey = cellKey;
2754
+ exports.selectionByRow = selectionByRow;
2755
+ exports.toggleCell = toggleCell;
2033
2756
  //# sourceMappingURL=index.cjs.map
2034
2757
  //# sourceMappingURL=index.cjs.map