@dataverse-kit/surface-kit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/v9.cjs ADDED
@@ -0,0 +1,993 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/v9/index.ts
21
+ var v9_exports = {};
22
+ __export(v9_exports, {
23
+ ActionBar: () => ActionBar,
24
+ BREAKPOINTS: () => BREAKPOINTS,
25
+ CALLOUT_DEFAULT_WIDTH: () => CALLOUT_DEFAULT_WIDTH,
26
+ CARD_REFLOW_WIDTH: () => CARD_REFLOW_WIDTH,
27
+ CalloutSurface: () => CalloutSurface,
28
+ CommandSurface: () => CommandSurface,
29
+ DIALOG_SIZE_PX: () => DIALOG_SIZE_PX,
30
+ DensityContext: () => DensityContext,
31
+ Footer: () => Footer,
32
+ FormDialogSurface: () => FormDialogSurface,
33
+ FormHeader: () => FormHeader,
34
+ FormSurface: () => FormSurface,
35
+ MODAL_AUTOSIZE_MIN_WIDTH: () => MODAL_AUTOSIZE_MIN_WIDTH,
36
+ ModalSurface: () => ModalSurface,
37
+ PANEL_DEFAULT_WIDTH: () => PANEL_DEFAULT_WIDTH,
38
+ PageSurface: () => PageSurface,
39
+ PanelSurface: () => PanelSurface,
40
+ PivotSurface: () => PivotSurface,
41
+ Section: () => Section,
42
+ SectionCard: () => SectionCard,
43
+ SectionHeader: () => SectionHeader,
44
+ TooltipSurface: () => TooltipSurface,
45
+ calloutFormDefaults: () => calloutFormDefaults,
46
+ calloutWidthPx: () => calloutWidthPx,
47
+ clampSpan: () => clampSpan,
48
+ colors: () => import_design_tokens.colors,
49
+ createDynamicsV9DarkTheme: () => createDynamicsV9DarkTheme,
50
+ createDynamicsV9Theme: () => createDynamicsV9Theme,
51
+ densityScale: () => densityScale,
52
+ dialogHeightCss: () => dialogHeightCss,
53
+ dialogWidthCss: () => dialogWidthCss,
54
+ dialogWidthPx: () => dialogWidthPx,
55
+ dynamicsBrandRamp: () => dynamicsBrandRamp,
56
+ dynamicsV9Theme: () => dynamicsV9Theme,
57
+ fieldGridStyle: () => fieldGridStyle,
58
+ fieldRowStyle: () => fieldRowStyle,
59
+ gridTemplateForColumns: () => gridTemplateForColumns,
60
+ layout: () => import_design_tokens.layout,
61
+ panelCustomWidthPx: () => panelCustomWidthPx,
62
+ panelKindFromWidth: () => panelKindFromWidth,
63
+ radius: () => import_design_tokens.radius,
64
+ resolveBreakpoint: () => resolveBreakpoint,
65
+ resolveResponsiveValue: () => resolveResponsiveValue,
66
+ scaleSpacing: () => scaleSpacing,
67
+ sectionStackingStyle: () => sectionStackingStyle,
68
+ spacing: () => import_design_tokens.spacing,
69
+ typography: () => import_design_tokens.typography,
70
+ useContainerBreakpoint: () => useContainerBreakpoint,
71
+ useContainerSize: () => useContainerSize,
72
+ useContainerWidth: () => useContainerWidth,
73
+ useDensity: () => useDensity,
74
+ useMediaQuery: () => useMediaQuery,
75
+ useResponsiveValue: () => useResponsiveValue
76
+ });
77
+ module.exports = __toCommonJS(v9_exports);
78
+
79
+ // src/core/sizePresets.ts
80
+ var DIALOG_SIZE_PX = {
81
+ sm: 600,
82
+ md: 900,
83
+ lg: 1200,
84
+ xl: 1600
85
+ };
86
+ function dialogWidthPx(opts = {}) {
87
+ if (typeof opts.width === "number") return opts.width;
88
+ const size = opts.size ?? "lg";
89
+ if (size === "fullscreen") return DIALOG_SIZE_PX.xl;
90
+ return DIALOG_SIZE_PX[size];
91
+ }
92
+ function dialogWidthCss(opts = {}) {
93
+ if (opts.size === "fullscreen" && opts.width == null) return "95vw";
94
+ return `${dialogWidthPx(opts)}px`;
95
+ }
96
+ function dialogHeightCss(height) {
97
+ return height != null && height <= 100 ? `${height}vh` : "95vh";
98
+ }
99
+ var MODAL_AUTOSIZE_MIN_WIDTH = 1e3;
100
+ var PANEL_DEFAULT_WIDTH = 480;
101
+ function panelKindFromWidth(width) {
102
+ return (width ?? PANEL_DEFAULT_WIDTH) > 500 ? "medium" : "custom";
103
+ }
104
+ function panelCustomWidthPx(width) {
105
+ return width ?? PANEL_DEFAULT_WIDTH;
106
+ }
107
+ var CALLOUT_DEFAULT_WIDTH = 320;
108
+ var calloutFormDefaults = {
109
+ width: CALLOUT_DEFAULT_WIDTH,
110
+ directionalHint: "bottomLeftEdge"
111
+ };
112
+ function calloutWidthPx(width) {
113
+ return width ?? CALLOUT_DEFAULT_WIDTH;
114
+ }
115
+
116
+ // src/core/columns.ts
117
+ function gridTemplateForColumns(columns) {
118
+ return `repeat(${columns}, 1fr)`;
119
+ }
120
+ function clampSpan(span, columns) {
121
+ if (!Number.isFinite(span)) return 1;
122
+ return Math.max(1, Math.min(Math.round(span), columns));
123
+ }
124
+
125
+ // src/responsive/breakpoints.ts
126
+ var BREAKPOINTS = {
127
+ xs: 0,
128
+ sm: 480,
129
+ md: 768,
130
+ lg: 1024,
131
+ xl: 1366
132
+ };
133
+ var CARD_REFLOW_WIDTH = 900;
134
+ var DESCENDING = ["xl", "lg", "md", "sm", "xs"];
135
+ var ASCENDING = ["xs", "sm", "md", "lg", "xl"];
136
+ function resolveBreakpoint(width) {
137
+ for (const bp of DESCENDING) {
138
+ if (width >= BREAKPOINTS[bp]) return bp;
139
+ }
140
+ return "xs";
141
+ }
142
+ function isResponsiveMap(v) {
143
+ return typeof v === "object" && v !== null && ASCENDING.some((bp) => bp in v);
144
+ }
145
+ function resolveResponsiveValue(value, breakpoint) {
146
+ if (!isResponsiveMap(value)) return value;
147
+ const map = value;
148
+ const idx = ASCENDING.indexOf(breakpoint);
149
+ for (let i = idx; i >= 0; i--) {
150
+ const v = map[ASCENDING[i]];
151
+ if (v !== void 0) return v;
152
+ }
153
+ for (let i = idx + 1; i < ASCENDING.length; i++) {
154
+ const v = map[ASCENDING[i]];
155
+ if (v !== void 0) return v;
156
+ }
157
+ return void 0;
158
+ }
159
+
160
+ // src/responsive/builders.ts
161
+ function atRule(mode, maxPx) {
162
+ return mode === "container" ? `@container (max-width: ${maxPx}px)` : `@media (max-width: ${maxPx}px)`;
163
+ }
164
+ function fieldGridStyle(columns, mode = "media") {
165
+ const capped = Math.min(columns, 2);
166
+ return {
167
+ display: "grid",
168
+ gridTemplateColumns: gridTemplateForColumns(columns),
169
+ gap: "4px 24px",
170
+ selectors: {
171
+ [atRule(mode, BREAKPOINTS.md)]: { gridTemplateColumns: gridTemplateForColumns(capped) },
172
+ [atRule(mode, BREAKPOINTS.sm)]: { gridTemplateColumns: "1fr" }
173
+ }
174
+ };
175
+ }
176
+ function sectionStackingStyle(gridTemplateColumns, mode = "media") {
177
+ return {
178
+ display: "grid",
179
+ gridTemplateColumns,
180
+ gap: 16,
181
+ alignItems: "start",
182
+ selectors: {
183
+ [atRule(mode, BREAKPOINTS.md)]: { gridTemplateColumns: "1fr" }
184
+ }
185
+ };
186
+ }
187
+ function fieldRowStyle(labelWidth = "130px", mode = "media") {
188
+ return {
189
+ display: "grid",
190
+ gridTemplateColumns: `${labelWidth} 1fr`,
191
+ alignItems: "center",
192
+ gap: 8,
193
+ minHeight: 38,
194
+ selectors: {
195
+ [atRule(mode, BREAKPOINTS.sm)]: { gridTemplateColumns: "1fr", alignItems: "flex-start", minHeight: 0, gap: 4 }
196
+ }
197
+ };
198
+ }
199
+
200
+ // src/tokens/tokens.ts
201
+ var import_design_tokens = require("@dataverse-kit/design-tokens");
202
+
203
+ // src/tokens/density.ts
204
+ var densityScale = {
205
+ comfortable: 1,
206
+ compact: 0.75
207
+ };
208
+ function scaleSpacing(value, density = "comfortable") {
209
+ return Math.round(value * densityScale[density]);
210
+ }
211
+
212
+ // src/hooks/useContainerSize.ts
213
+ var import_react = require("react");
214
+ function useContainerSize(ref) {
215
+ const [size, setSize] = (0, import_react.useState)({ width: 0, height: 0, inlineSize: 0, blockSize: 0 });
216
+ (0, import_react.useEffect)(() => {
217
+ if (!ref.current || typeof ResizeObserver === "undefined") return;
218
+ const observer = new ResizeObserver((entries) => {
219
+ for (const entry of entries) {
220
+ const { width, height } = entry.contentRect;
221
+ const inlineSize = entry.borderBoxSize?.[0]?.inlineSize ?? width;
222
+ const blockSize = entry.borderBoxSize?.[0]?.blockSize ?? height;
223
+ setSize({ width, height, inlineSize, blockSize });
224
+ }
225
+ });
226
+ observer.observe(ref.current);
227
+ return () => observer.disconnect();
228
+ }, [ref]);
229
+ return size;
230
+ }
231
+
232
+ // src/hooks/useContainerWidth.ts
233
+ var import_react2 = require("react");
234
+ function useContainerWidth() {
235
+ const ref = (0, import_react2.useRef)(null);
236
+ const { width } = useContainerSize(ref);
237
+ return [ref, width];
238
+ }
239
+
240
+ // src/hooks/useContainerBreakpoint.ts
241
+ function useContainerBreakpoint() {
242
+ const [ref, width] = useContainerWidth();
243
+ return [ref, resolveBreakpoint(width), width];
244
+ }
245
+
246
+ // src/hooks/useResponsiveValue.ts
247
+ function useResponsiveValue(value) {
248
+ const [ref, breakpoint] = useContainerBreakpoint();
249
+ return [ref, resolveResponsiveValue(value, breakpoint)];
250
+ }
251
+
252
+ // src/hooks/useMediaQuery.ts
253
+ var import_react3 = require("react");
254
+ function useMediaQuery(query) {
255
+ const [matches, setMatches] = (0, import_react3.useState)(() => {
256
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
257
+ return window.matchMedia(query).matches;
258
+ });
259
+ (0, import_react3.useEffect)(() => {
260
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
261
+ const mql = window.matchMedia(query);
262
+ const onChange = () => setMatches(mql.matches);
263
+ onChange();
264
+ mql.addEventListener("change", onChange);
265
+ return () => mql.removeEventListener("change", onChange);
266
+ }, [query]);
267
+ return matches;
268
+ }
269
+
270
+ // src/hooks/useDensity.ts
271
+ var import_react4 = require("react");
272
+ var DensityContext = (0, import_react4.createContext)("comfortable");
273
+ var useDensity = () => (0, import_react4.useContext)(DensityContext);
274
+
275
+ // src/v9/theme.ts
276
+ var import_react_components = require("@fluentui/react-components");
277
+ var dynamicsBrandRamp = {
278
+ 10: "#061724",
279
+ 20: "#082338",
280
+ 30: "#0a2e4a",
281
+ 40: "#0c3b5e",
282
+ 50: "#0e4775",
283
+ 60: import_design_tokens.colors.brandDark,
284
+ // #005a9e — colorBrandBackgroundPressed
285
+ 70: import_design_tokens.colors.brandHover,
286
+ // #106ebe — colorBrandBackground(Hover/Selected)
287
+ 80: import_design_tokens.colors.brand,
288
+ // #0078d4 — colorBrandBackground + colorBrandForeground1 (the Dynamics blue)
289
+ 90: "#2886de",
290
+ 100: "#479ef5",
291
+ 110: "#62abf5",
292
+ 120: "#77b7f7",
293
+ 130: "#96c6fa",
294
+ 140: "#b4d6fa",
295
+ 150: "#cfe4fa",
296
+ 160: "#ebf3fc"
297
+ };
298
+ function createDynamicsV9Theme(brand = dynamicsBrandRamp) {
299
+ return (0, import_react_components.createLightTheme)(brand);
300
+ }
301
+ function createDynamicsV9DarkTheme(brand = dynamicsBrandRamp) {
302
+ return (0, import_react_components.createDarkTheme)(brand);
303
+ }
304
+ var dynamicsV9Theme = createDynamicsV9Theme();
305
+
306
+ // src/v9/containers/FormSurface.tsx
307
+ var import_react_components2 = require("@fluentui/react-components");
308
+ var import_jsx_runtime = require("react/jsx-runtime");
309
+ var useStyles = (0, import_react_components2.makeStyles)({
310
+ root: {
311
+ display: "grid",
312
+ alignItems: "start",
313
+ backgroundColor: import_react_components2.tokens.colorNeutralBackground2
314
+ },
315
+ // Container forced a single column: reset every child's span the same way the @media
316
+ // fallback does, so a Section with `columnStart` doesn't escape the stack.
317
+ forceStackChildren: {
318
+ "& > *": { gridColumn: "1 / -1" }
319
+ },
320
+ // Viewport fallbacks (used only when containerWidth is unset) — one static slot per
321
+ // breakpoint so griffel gets literal media strings. The px come from the shared BREAKPOINTS.
322
+ stackSm: { [`@media (max-width: ${BREAKPOINTS.sm}px)`]: { "& > *": { gridColumn: "1 / -1" } } },
323
+ stackMd: { [`@media (max-width: ${BREAKPOINTS.md}px)`]: { "& > *": { gridColumn: "1 / -1" } } },
324
+ stackLg: { [`@media (max-width: ${BREAKPOINTS.lg}px)`]: { "& > *": { gridColumn: "1 / -1" } } },
325
+ stackXl: { [`@media (max-width: ${BREAKPOINTS.xl}px)`]: { "& > *": { gridColumn: "1 / -1" } } }
326
+ });
327
+ var VIEWPORT_STACK = {
328
+ xs: null,
329
+ // xs = 0px, never stacks
330
+ sm: "stackSm",
331
+ md: "stackMd",
332
+ lg: "stackLg",
333
+ xl: "stackXl"
334
+ };
335
+ var FormSurface = ({
336
+ columns = 12,
337
+ gap = 20,
338
+ padding = 20,
339
+ density = "comfortable",
340
+ background,
341
+ containerWidth,
342
+ collapseBelow = "sm",
343
+ maxWidth,
344
+ className,
345
+ style,
346
+ children
347
+ }) => {
348
+ const styles = useStyles();
349
+ const collapsePx = BREAKPOINTS[collapseBelow];
350
+ const forceStack = containerWidth != null && containerWidth <= collapsePx;
351
+ const scaledGap = scaleSpacing(gap, density);
352
+ const scaledPadding = scaleSpacing(padding, density);
353
+ const viewportStackSlot = containerWidth == null ? VIEWPORT_STACK[collapseBelow] : null;
354
+ const cls = (0, import_react_components2.mergeClasses)(
355
+ styles.root,
356
+ forceStack && styles.forceStackChildren,
357
+ viewportStackSlot ? styles[viewportStackSlot] : void 0,
358
+ className
359
+ );
360
+ const inlineStyle = {
361
+ gridTemplateColumns: forceStack ? "1fr" : `repeat(${columns}, 1fr)`,
362
+ gap: scaledGap,
363
+ padding: scaledPadding,
364
+ ...background != null ? { background } : {},
365
+ ...maxWidth != null ? { maxWidth, marginLeft: "auto", marginRight: "auto" } : {},
366
+ ...style
367
+ };
368
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DensityContext.Provider, { value: density, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cls, style: inlineStyle, children }) });
369
+ };
370
+
371
+ // src/v9/containers/PageSurface.tsx
372
+ var import_jsx_runtime2 = require("react/jsx-runtime");
373
+ var PageSurface = ({ centered, maxWidth, ...rest }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(FormSurface, { maxWidth: maxWidth ?? (centered ? 1200 : void 0), ...rest });
374
+
375
+ // src/v9/containers/Section.tsx
376
+ var import_react5 = require("react");
377
+ var import_react_components4 = require("@fluentui/react-components");
378
+
379
+ // src/v9/containers/SectionHeader.tsx
380
+ var import_react_components3 = require("@fluentui/react-components");
381
+ var import_react_icons = require("@fluentui/react-icons");
382
+ var import_jsx_runtime3 = require("react/jsx-runtime");
383
+ var SectionHeader = ({
384
+ title,
385
+ statusText,
386
+ showCommandBar,
387
+ commandItems = [],
388
+ actions,
389
+ collapsible,
390
+ collapsed,
391
+ onToggle
392
+ }) => {
393
+ const rootStyle = {
394
+ display: "flex",
395
+ justifyContent: "space-between",
396
+ alignItems: "center",
397
+ flexWrap: "nowrap",
398
+ borderBottom: `1px solid ${import_react_components3.tokens.colorNeutralStroke2}`,
399
+ marginBottom: 16,
400
+ minHeight: 48,
401
+ width: "100%"
402
+ };
403
+ const leftStyle = { display: "flex", alignItems: "center", gap: 8, minWidth: 0 };
404
+ const statusStyle = {
405
+ marginLeft: 8,
406
+ fontSize: import_react_components3.tokens.fontSizeBase200,
407
+ color: import_react_components3.tokens.colorNeutralForeground3
408
+ };
409
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: rootStyle, children: [
410
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: leftStyle, children: [
411
+ collapsible && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
412
+ import_react_components3.Button,
413
+ {
414
+ appearance: "subtle",
415
+ size: "small",
416
+ icon: collapsed ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_icons.ChevronRight20Regular, {}) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_icons.ChevronDown20Regular, {}),
417
+ onClick: onToggle,
418
+ "aria-label": collapsed ? "Expand section" : "Collapse section",
419
+ "aria-expanded": !collapsed
420
+ }
421
+ ),
422
+ title && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_components3.Text, { weight: "semibold", size: 300, children: title }),
423
+ statusText && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: statusStyle, children: statusText })
424
+ ] }),
425
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { children: actions }) : showCommandBar && commandItems.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_components3.Toolbar, { "aria-label": "Section commands", size: "small", children: commandItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
426
+ import_react_components3.ToolbarButton,
427
+ {
428
+ icon: item.icon,
429
+ appearance: item.appearance === "primary" ? "primary" : "subtle",
430
+ disabled: item.disabled,
431
+ onClick: item.onClick,
432
+ children: item.label
433
+ },
434
+ item.id
435
+ )) }) : null
436
+ ] });
437
+ };
438
+
439
+ // src/v9/containers/Section.tsx
440
+ var import_jsx_runtime4 = require("react/jsx-runtime");
441
+ var useStyles2 = (0, import_react_components4.makeStyles)({
442
+ // Phone-stack the internal field grid below `sm` (griffel — inline can't do @media).
443
+ bodyStack: {
444
+ [`@media (max-width: ${BREAKPOINTS.sm}px)`]: { "& > *": { gridColumn: "1 / -1" } }
445
+ }
446
+ });
447
+ var Section = ({
448
+ title,
449
+ columnSpan = 12,
450
+ columnStart,
451
+ rowPosition,
452
+ internalColumns = 12,
453
+ showCommandBar,
454
+ commandItems,
455
+ statusText,
456
+ notification,
457
+ collapsible,
458
+ defaultCollapsed = false,
459
+ collapsed: controlledCollapsed,
460
+ onCollapsedChange,
461
+ variant = "card",
462
+ minHeight = 80,
463
+ density: densityProp,
464
+ className,
465
+ style,
466
+ children
467
+ }) => {
468
+ const styles = useStyles2();
469
+ const [internalCollapsed, setInternalCollapsed] = (0, import_react5.useState)(defaultCollapsed);
470
+ const collapsed = controlledCollapsed ?? internalCollapsed;
471
+ const toggle = () => {
472
+ const next = !collapsed;
473
+ if (controlledCollapsed == null) setInternalCollapsed(next);
474
+ onCollapsedChange?.(next);
475
+ };
476
+ const ctxDensity = useDensity();
477
+ const density = densityProp ?? ctxDensity;
478
+ const cardPad = `${scaleSpacing(3, density)}px ${scaleSpacing(20, density)}px ${scaleSpacing(20, density)}px ${scaleSpacing(20, density)}px`;
479
+ const bodyGap = scaleSpacing(7, density);
480
+ const gridColumn = columnStart ? `${columnStart} / span ${columnSpan}` : `span ${columnSpan}`;
481
+ const rootStyle = {
482
+ gridColumn,
483
+ ...rowPosition ? { gridRowStart: rowPosition } : {},
484
+ ...style
485
+ };
486
+ if (variant === "placeholder") {
487
+ const placeholderStyle = {
488
+ ...rootStyle,
489
+ border: `1px dashed ${import_react_components4.tokens.colorNeutralStroke2}`,
490
+ borderRadius: import_react_components4.tokens.borderRadiusMedium,
491
+ minHeight,
492
+ width: "100%",
493
+ background: "transparent"
494
+ };
495
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className, style: placeholderStyle });
496
+ }
497
+ const chrome = variant === "flat" ? {
498
+ backgroundColor: import_react_components4.tokens.colorNeutralBackground1,
499
+ borderRadius: import_react_components4.tokens.borderRadiusMedium,
500
+ padding: cardPad,
501
+ minWidth: 300,
502
+ width: "100%",
503
+ overflow: "hidden"
504
+ } : {
505
+ backgroundColor: import_react_components4.tokens.colorNeutralBackground1,
506
+ border: `1px solid ${import_react_components4.tokens.colorNeutralStroke2}`,
507
+ borderRadius: import_react_components4.tokens.borderRadiusMedium,
508
+ boxShadow: import_react_components4.tokens.shadow4,
509
+ padding: cardPad,
510
+ minWidth: 300,
511
+ width: "100%",
512
+ overflow: "hidden"
513
+ };
514
+ const showHeader = Boolean(title) || showCommandBar || collapsible;
515
+ const bodyStyle = {
516
+ display: "grid",
517
+ gridTemplateColumns: `repeat(${internalColumns}, 1fr)`,
518
+ gap: bodyGap,
519
+ alignItems: "start"
520
+ };
521
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className, style: { ...chrome, ...rootStyle }, children: [
522
+ notification && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { marginBottom: scaleSpacing(8, density) }, children: notification }),
523
+ showHeader && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
524
+ SectionHeader,
525
+ {
526
+ title,
527
+ statusText,
528
+ showCommandBar,
529
+ commandItems,
530
+ collapsible,
531
+ collapsed,
532
+ onToggle: toggle
533
+ }
534
+ ),
535
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: (0, import_react_components4.mergeClasses)(styles.bodyStack), style: bodyStyle, children })
536
+ ] });
537
+ };
538
+
539
+ // src/v9/containers/SectionCard.tsx
540
+ var import_react_components5 = require("@fluentui/react-components");
541
+ var import_jsx_runtime5 = require("react/jsx-runtime");
542
+ var SectionCard = ({
543
+ accentColor = import_react_components5.tokens.colorBrandStroke1,
544
+ accentWidth = 3,
545
+ variant = "card",
546
+ style,
547
+ ...rest
548
+ }) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
549
+ Section,
550
+ {
551
+ variant,
552
+ ...rest,
553
+ style: { borderTop: `${accentWidth}px solid ${accentColor}`, ...style }
554
+ }
555
+ );
556
+
557
+ // src/v9/containers/FormHeader.tsx
558
+ var import_react_components6 = require("@fluentui/react-components");
559
+ var import_jsx_runtime6 = require("react/jsx-runtime");
560
+ var FormHeader = ({
561
+ title,
562
+ subtitle,
563
+ status,
564
+ titleColor,
565
+ subtitleColor,
566
+ persona,
567
+ actions,
568
+ className
569
+ }) => {
570
+ const rootStyle = {
571
+ display: "flex",
572
+ alignItems: "center",
573
+ justifyContent: "space-between",
574
+ gap: 12,
575
+ padding: "12px 24px",
576
+ borderBottom: `1px solid ${import_react_components6.tokens.colorNeutralStroke2}`,
577
+ backgroundColor: import_react_components6.tokens.colorNeutralBackground1
578
+ };
579
+ const mainStyle = { display: "flex", alignItems: "center", gap: 12, minWidth: 0 };
580
+ const titleRowStyle = { display: "flex", alignItems: "baseline", gap: 8, flexWrap: "wrap" };
581
+ const statusStyle = { fontSize: import_react_components6.tokens.fontSizeBase200, color: import_react_components6.tokens.colorNeutralForeground3 };
582
+ const subtitleStyle = {
583
+ fontSize: import_react_components6.tokens.fontSizeBase200,
584
+ color: subtitleColor || import_react_components6.tokens.colorNeutralForeground3,
585
+ marginTop: 2
586
+ };
587
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className, style: rootStyle, children: [
588
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: mainStyle, children: [
589
+ persona,
590
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
591
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: titleRowStyle, children: [
592
+ title != null && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_components6.Text, { weight: "semibold", size: 400, style: titleColor ? { color: titleColor } : void 0, children: title }),
593
+ status != null && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: statusStyle, children: status })
594
+ ] }),
595
+ subtitle != null && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: subtitleStyle, children: subtitle })
596
+ ] })
597
+ ] }),
598
+ actions != null && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { children: actions })
599
+ ] });
600
+ };
601
+
602
+ // src/v9/containers/PivotSurface.tsx
603
+ var import_react6 = require("react");
604
+ var import_react_components7 = require("@fluentui/react-components");
605
+ var import_jsx_runtime7 = require("react/jsx-runtime");
606
+ var PivotSurface = ({
607
+ tabs,
608
+ selectedId,
609
+ defaultSelectedId,
610
+ onTabChange,
611
+ appearance = "transparent",
612
+ size = "medium",
613
+ className
614
+ }) => {
615
+ const firstEnabledId = tabs.find((t) => !t.disabled)?.id ?? tabs[0]?.id;
616
+ const [internal, setInternal] = (0, import_react6.useState)(defaultSelectedId ?? firstEnabledId);
617
+ const selected = selectedId ?? internal;
618
+ const handleSelect = (_e, data) => {
619
+ const id = String(data.value);
620
+ if (selectedId == null) setInternal(id);
621
+ onTabChange?.(id);
622
+ };
623
+ const active = tabs.find((t) => t.id === selected) ?? tabs[0];
624
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className, children: [
625
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_components7.TabList, { selectedValue: selected, onTabSelect: handleSelect, appearance, size, children: tabs.map((t) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_components7.Tab, { value: t.id, icon: t.icon, disabled: t.disabled, children: t.label }, t.id)) }),
626
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { children: active?.content })
627
+ ] });
628
+ };
629
+
630
+ // src/v9/containers/CommandSurface.tsx
631
+ var import_react_components8 = require("@fluentui/react-components");
632
+ var import_react_icons2 = require("@fluentui/react-icons");
633
+ var import_jsx_runtime8 = require("react/jsx-runtime");
634
+ function renderToolbarButton(item) {
635
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
636
+ import_react_components8.ToolbarButton,
637
+ {
638
+ icon: item.icon,
639
+ appearance: item.appearance === "primary" ? "primary" : "subtle",
640
+ disabled: item.disabled,
641
+ onClick: item.onClick,
642
+ children: item.label
643
+ },
644
+ item.id
645
+ );
646
+ }
647
+ var CommandSurface = ({
648
+ items,
649
+ overflowItems,
650
+ farItems,
651
+ size = "small",
652
+ className
653
+ }) => {
654
+ const hasFar = Boolean(farItems && farItems.length > 0);
655
+ const hasOverflow = Boolean(overflowItems && overflowItems.length > 0);
656
+ const hasPrimary = items.length > 0 || hasOverflow;
657
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className, style: { display: "flex", alignItems: "center", gap: 8 }, children: [
658
+ hasPrimary && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_components8.Toolbar, { "aria-label": "Commands", size, children: [
659
+ items.map(renderToolbarButton),
660
+ hasOverflow && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_components8.Menu, { children: [
661
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_components8.MenuTrigger, { disableButtonEnhancement: true, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_components8.ToolbarButton, { "aria-label": "More commands", icon: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_icons2.MoreHorizontal20Regular, {}) }) }),
662
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_components8.MenuPopover, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_components8.MenuList, { children: overflowItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_components8.MenuItem, { icon: item.icon, disabled: item.disabled, onClick: item.onClick, children: item.label }, item.id)) }) })
663
+ ] })
664
+ ] }),
665
+ hasFar && // marginLeft:auto keeps far items right-aligned whether or not a primary toolbar renders.
666
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_components8.Toolbar, { "aria-label": "Secondary commands", size, style: { marginLeft: "auto" }, children: farItems.map(renderToolbarButton) })
667
+ ] });
668
+ };
669
+
670
+ // src/v9/containers/ActionBar.tsx
671
+ var import_react_components9 = require("@fluentui/react-components");
672
+ var import_jsx_runtime9 = require("react/jsx-runtime");
673
+ function renderButton(b) {
674
+ const appearance = b.appearance === "primary" ? "primary" : b.appearance === "subtle" ? "subtle" : "secondary";
675
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_components9.Button, { appearance, icon: b.icon, disabled: b.disabled, onClick: b.onClick, children: b.label }, b.id);
676
+ }
677
+ var ActionBar = ({ buttons, alignment = "right", sticky = true, className }) => {
678
+ const justify = alignment === "left" ? "flex-start" : alignment === "center" ? "center" : "flex-end";
679
+ const visible = buttons.filter((b) => !b.hidden);
680
+ const left = visible.filter((b) => b.position === "left");
681
+ const right = visible.filter((b) => b.position !== "left");
682
+ const rootStyle = {
683
+ display: "flex",
684
+ alignItems: "center",
685
+ justifyContent: left.length ? "space-between" : justify,
686
+ gap: 8,
687
+ padding: "12px 24px",
688
+ borderTop: `1px solid ${import_react_components9.tokens.colorNeutralStroke2}`,
689
+ backgroundColor: import_react_components9.tokens.colorNeutralBackground1,
690
+ ...sticky ? { position: "sticky", bottom: 0, zIndex: 1 } : {}
691
+ };
692
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className, style: rootStyle, children: [
693
+ left.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { display: "flex", gap: 8 }, children: left.map(renderButton) }),
694
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { display: "flex", gap: 8, justifyContent: justify }, children: right.map(renderButton) })
695
+ ] });
696
+ };
697
+
698
+ // src/v9/containers/Footer.tsx
699
+ var import_react_components10 = require("@fluentui/react-components");
700
+ var import_jsx_runtime10 = require("react/jsx-runtime");
701
+ var Footer = ({ sticky = true, align = "right", className, children }) => {
702
+ const justify = align === "left" ? "flex-start" : align === "center" ? "center" : "flex-end";
703
+ const rootStyle = {
704
+ display: "flex",
705
+ alignItems: "center",
706
+ justifyContent: justify,
707
+ gap: 8,
708
+ padding: "12px 24px",
709
+ borderTop: `1px solid ${import_react_components10.tokens.colorNeutralStroke2}`,
710
+ backgroundColor: import_react_components10.tokens.colorNeutralBackground1,
711
+ ...sticky ? { position: "sticky", bottom: 0, zIndex: 1 } : {}
712
+ };
713
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className, style: rootStyle, children });
714
+ };
715
+
716
+ // src/v9/overlays/FormDialogSurface.tsx
717
+ var import_react_components11 = require("@fluentui/react-components");
718
+ var import_react_icons3 = require("@fluentui/react-icons");
719
+ var import_jsx_runtime11 = require("react/jsx-runtime");
720
+ var FormDialogSurface = ({
721
+ isOpen,
722
+ onDismiss,
723
+ title,
724
+ subheader,
725
+ size,
726
+ width,
727
+ height,
728
+ isBlocking = true,
729
+ recordCounter,
730
+ footer,
731
+ className,
732
+ children
733
+ }) => {
734
+ const widthCss = dialogWidthCss({ width, size });
735
+ const heightCss = dialogHeightCss(height);
736
+ const showHeader = Boolean(title) || Boolean(recordCounter) || Boolean(onDismiss);
737
+ const headerStyle = {
738
+ display: "flex",
739
+ alignItems: "center",
740
+ justifyContent: "space-between",
741
+ gap: 12,
742
+ padding: "12px 20px",
743
+ borderBottom: `1px solid ${import_react_components11.tokens.colorNeutralStroke2}`
744
+ };
745
+ const counterStyle = { fontSize: import_react_components11.tokens.fontSizeBase200, color: import_react_components11.tokens.colorNeutralForeground3 };
746
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
747
+ import_react_components11.Dialog,
748
+ {
749
+ open: isOpen,
750
+ modalType: isBlocking ? "modal" : "non-modal",
751
+ onOpenChange: (_e, data) => {
752
+ if (!data.open) onDismiss?.();
753
+ },
754
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
755
+ import_react_components11.DialogSurface,
756
+ {
757
+ className,
758
+ style: {
759
+ maxWidth: "95vw",
760
+ width: widthCss,
761
+ height: heightCss,
762
+ maxHeight: "95vh",
763
+ display: "flex",
764
+ flexDirection: "column",
765
+ padding: 0
766
+ },
767
+ children: [
768
+ showHeader && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: headerStyle, children: [
769
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { display: "flex", flexDirection: "column", minWidth: 0 }, children: [
770
+ title && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_components11.Text, { weight: "semibold", size: 400, children: title }),
771
+ subheader && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { fontSize: import_react_components11.tokens.fontSizeBase200, color: import_react_components11.tokens.colorNeutralForeground3, marginTop: 2 }, children: subheader })
772
+ ] }),
773
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
774
+ recordCounter && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { style: counterStyle, children: [
775
+ recordCounter.current,
776
+ " of ",
777
+ recordCounter.total
778
+ ] }),
779
+ onDismiss && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_components11.Button, { appearance: "subtle", "aria-label": "Close", icon: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_icons3.Dismiss20Regular, {}), onClick: onDismiss })
780
+ ] })
781
+ ] }),
782
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: { flex: 1, minHeight: 0, overflow: "auto", padding: 20 }, children }),
783
+ footer && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: { borderTop: `1px solid ${import_react_components11.tokens.colorNeutralStroke2}`, padding: "12px 20px" }, children: footer })
784
+ ]
785
+ }
786
+ )
787
+ }
788
+ );
789
+ };
790
+
791
+ // src/v9/overlays/ModalSurface.tsx
792
+ var import_react_components12 = require("@fluentui/react-components");
793
+ var import_jsx_runtime12 = require("react/jsx-runtime");
794
+ var ModalSurface = ({
795
+ isOpen,
796
+ onDismiss,
797
+ title,
798
+ size,
799
+ width,
800
+ isBlocking = true,
801
+ autoSize,
802
+ footer,
803
+ className,
804
+ children
805
+ }) => {
806
+ const sizing = autoSize ? { width: "auto", minWidth: MODAL_AUTOSIZE_MIN_WIDTH, maxWidth: "100%" } : { maxWidth: "95vw", width: `${dialogWidthPx({ width, size })}px` };
807
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
808
+ import_react_components12.Dialog,
809
+ {
810
+ open: isOpen,
811
+ modalType: isBlocking ? "modal" : "non-modal",
812
+ onOpenChange: (_e, data) => {
813
+ if (!data.open) onDismiss?.();
814
+ },
815
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_components12.DialogSurface, { className, style: { ...sizing, padding: 0 }, children: [
816
+ title && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { padding: "16px 20px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components12.Text, { weight: "semibold", size: 500, children: title }) }),
817
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { padding: 20 }, children }),
818
+ footer && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
819
+ "div",
820
+ {
821
+ style: {
822
+ borderTop: `1px solid ${import_react_components12.tokens.colorNeutralStroke2}`,
823
+ padding: "12px 20px",
824
+ display: "flex",
825
+ justifyContent: "flex-end",
826
+ gap: 8
827
+ },
828
+ children: footer
829
+ }
830
+ )
831
+ ] })
832
+ }
833
+ );
834
+ };
835
+
836
+ // src/v9/overlays/PanelSurface.tsx
837
+ var import_react_components13 = require("@fluentui/react-components");
838
+ var import_react_icons4 = require("@fluentui/react-icons");
839
+ var import_jsx_runtime13 = require("react/jsx-runtime");
840
+ var PanelSurface = ({
841
+ isOpen,
842
+ onDismiss,
843
+ title,
844
+ drawerSize,
845
+ width,
846
+ hasCloseButton = true,
847
+ isLightDismiss = true,
848
+ isNonModal = false,
849
+ footer,
850
+ children
851
+ }) => {
852
+ const size = drawerSize ?? (width != null && width > 500 ? "medium" : "small");
853
+ const customWidthStyle = width != null ? { width: `${width}px` } : void 0;
854
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
855
+ import_react_components13.OverlayDrawer,
856
+ {
857
+ open: isOpen,
858
+ position: "end",
859
+ size,
860
+ modalType: isNonModal ? "non-modal" : "modal",
861
+ style: customWidthStyle,
862
+ onOpenChange: (_e, data) => {
863
+ if (data.open) return;
864
+ if (data.type === "backdropClick" && !isLightDismiss) return;
865
+ onDismiss?.();
866
+ },
867
+ children: [
868
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_components13.DrawerHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
869
+ import_react_components13.DrawerHeaderTitle,
870
+ {
871
+ action: hasCloseButton && onDismiss ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_components13.Button, { appearance: "subtle", "aria-label": "Close", icon: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_icons4.Dismiss24Regular, {}), onClick: onDismiss }) : void 0,
872
+ children: title
873
+ }
874
+ ) }),
875
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_react_components13.DrawerBody, { children: [
876
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { padding: "12px 0" }, children }),
877
+ footer && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { marginTop: "auto", paddingTop: 12 }, children: footer })
878
+ ] })
879
+ ]
880
+ }
881
+ );
882
+ };
883
+
884
+ // src/v9/overlays/CalloutSurface.tsx
885
+ var import_react_components14 = require("@fluentui/react-components");
886
+ var import_jsx_runtime14 = require("react/jsx-runtime");
887
+ function resolveTarget(target) {
888
+ if (!target) return null;
889
+ if (typeof target === "string") return document.querySelector(target);
890
+ if ("current" in target) return target.current ?? null;
891
+ return target;
892
+ }
893
+ var CalloutSurface = ({
894
+ target,
895
+ isOpen = true,
896
+ onDismiss,
897
+ width,
898
+ position = "below",
899
+ align = "start",
900
+ isBeakVisible = true,
901
+ className,
902
+ children
903
+ }) => {
904
+ if (!isOpen) return null;
905
+ const el = resolveTarget(target);
906
+ const positioning = { position, align, ...el ? { target: el } : {} };
907
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
908
+ import_react_components14.Popover,
909
+ {
910
+ open: true,
911
+ trapFocus: false,
912
+ withArrow: isBeakVisible,
913
+ positioning,
914
+ onOpenChange: (_e, data) => {
915
+ if (!data.open) onDismiss?.();
916
+ },
917
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_components14.PopoverSurface, { className, style: { width: calloutWidthPx(width), padding: 16 }, children })
918
+ }
919
+ );
920
+ };
921
+
922
+ // src/v9/overlays/TooltipSurface.tsx
923
+ var import_react_components15 = require("@fluentui/react-components");
924
+ var import_jsx_runtime15 = require("react/jsx-runtime");
925
+ var DELAY_MS = {
926
+ zero: 0,
927
+ medium: 250,
928
+ long: 500
929
+ };
930
+ var TooltipSurface = ({
931
+ content,
932
+ position = "above",
933
+ delay = "medium",
934
+ relationship = "label",
935
+ children
936
+ }) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_components15.Tooltip, { content, relationship, positioning: position, showDelay: DELAY_MS[delay], children });
937
+ // Annotate the CommonJS export names for ESM import in node:
938
+ 0 && (module.exports = {
939
+ ActionBar,
940
+ BREAKPOINTS,
941
+ CALLOUT_DEFAULT_WIDTH,
942
+ CARD_REFLOW_WIDTH,
943
+ CalloutSurface,
944
+ CommandSurface,
945
+ DIALOG_SIZE_PX,
946
+ DensityContext,
947
+ Footer,
948
+ FormDialogSurface,
949
+ FormHeader,
950
+ FormSurface,
951
+ MODAL_AUTOSIZE_MIN_WIDTH,
952
+ ModalSurface,
953
+ PANEL_DEFAULT_WIDTH,
954
+ PageSurface,
955
+ PanelSurface,
956
+ PivotSurface,
957
+ Section,
958
+ SectionCard,
959
+ SectionHeader,
960
+ TooltipSurface,
961
+ calloutFormDefaults,
962
+ calloutWidthPx,
963
+ clampSpan,
964
+ colors,
965
+ createDynamicsV9DarkTheme,
966
+ createDynamicsV9Theme,
967
+ densityScale,
968
+ dialogHeightCss,
969
+ dialogWidthCss,
970
+ dialogWidthPx,
971
+ dynamicsBrandRamp,
972
+ dynamicsV9Theme,
973
+ fieldGridStyle,
974
+ fieldRowStyle,
975
+ gridTemplateForColumns,
976
+ layout,
977
+ panelCustomWidthPx,
978
+ panelKindFromWidth,
979
+ radius,
980
+ resolveBreakpoint,
981
+ resolveResponsiveValue,
982
+ scaleSpacing,
983
+ sectionStackingStyle,
984
+ spacing,
985
+ typography,
986
+ useContainerBreakpoint,
987
+ useContainerSize,
988
+ useContainerWidth,
989
+ useDensity,
990
+ useMediaQuery,
991
+ useResponsiveValue
992
+ });
993
+ //# sourceMappingURL=v9.cjs.map