@heymantle/litho 0.0.9 → 0.0.12
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/cjs/components/Banner.js +6 -1
- package/dist/cjs/components/Button.js +33 -4
- package/dist/cjs/components/ButtonGroup.js +19 -4
- package/dist/cjs/components/Card.js +39 -3
- package/dist/cjs/components/Checkbox.js +13 -2
- package/dist/cjs/components/ChoiceList.js +3 -2
- package/dist/cjs/components/Code.js +227 -0
- package/dist/cjs/components/Filters.js +1 -1
- package/dist/cjs/components/Frame.js +2 -2
- package/dist/cjs/components/Layout.js +16 -4
- package/dist/cjs/components/Link.js +35 -4
- package/dist/cjs/components/Modal.js +4 -0
- package/dist/cjs/components/Page.js +5 -2
- package/dist/cjs/components/Pane.js +669 -84
- package/dist/cjs/components/ResourceList.js +2 -2
- package/dist/cjs/components/TabNavigation.js +300 -0
- package/dist/cjs/components/TextField.js +3 -0
- package/dist/cjs/components/Tip.js +3 -0
- package/dist/cjs/components/Tooltip.js +12 -13
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/stories/Checkbox.stories.js +172 -1
- package/dist/cjs/stories/Pane.stories.js +352 -3
- package/dist/cjs/utilities/useBodyScrollLock.js +63 -0
- package/dist/cjs/utilities/useKeyboardAction.js +19 -0
- package/dist/cjs/utilities/useLocalStorage.js +126 -0
- package/dist/cjs/utilities/useMobile.js +92 -0
- package/dist/cjs/utilities/usePaneState.js +340 -0
- package/dist/cjs/utilities/useTabStorage.js +325 -0
- package/dist/esm/components/Banner.js +7 -2
- package/dist/esm/components/Button.js +33 -4
- package/dist/esm/components/ButtonGroup.js +19 -4
- package/dist/esm/components/Card.js +39 -3
- package/dist/esm/components/Checkbox.js +13 -2
- package/dist/esm/components/ChoiceList.js +3 -2
- package/dist/esm/components/Code.js +212 -0
- package/dist/esm/components/Filters.js +2 -2
- package/dist/esm/components/Frame.js +2 -2
- package/dist/esm/components/Layout.js +16 -4
- package/dist/esm/components/Link.js +31 -5
- package/dist/esm/components/Modal.js +4 -0
- package/dist/esm/components/Page.js +5 -2
- package/dist/esm/components/Pane.js +619 -83
- package/dist/esm/components/ResourceList.js +2 -2
- package/dist/esm/components/TabNavigation.js +285 -0
- package/dist/esm/components/TextField.js +4 -1
- package/dist/esm/components/Tip.js +4 -1
- package/dist/esm/components/Tooltip.js +12 -13
- package/dist/esm/index.js +1 -0
- package/dist/esm/stories/Checkbox.stories.js +166 -1
- package/dist/esm/stories/Pane.stories.js +346 -3
- package/dist/esm/utilities/useBodyScrollLock.js +53 -0
- package/dist/esm/utilities/useKeyboardAction.js +25 -0
- package/dist/esm/utilities/useLocalStorage.js +115 -0
- package/dist/esm/utilities/useMobile.js +79 -0
- package/dist/esm/utilities/usePaneState.js +334 -0
- package/dist/esm/utilities/useTabStorage.js +311 -0
- package/dist/types/components/Banner.d.ts.map +1 -1
- package/dist/types/components/Button.d.ts +2 -2
- package/dist/types/components/Button.d.ts.map +1 -1
- package/dist/types/components/ButtonGroup.d.ts.map +1 -1
- package/dist/types/components/Card.d.ts +34 -1
- package/dist/types/components/Card.d.ts.map +1 -1
- package/dist/types/components/Checkbox.d.ts +11 -2
- package/dist/types/components/Checkbox.d.ts.map +1 -1
- package/dist/types/components/Code.d.ts +28 -0
- package/dist/types/components/Code.d.ts.map +1 -0
- package/dist/types/components/Filters.d.ts.map +1 -1
- package/dist/types/components/Layout.d.ts +2 -0
- package/dist/types/components/Layout.d.ts.map +1 -1
- package/dist/types/components/Link.d.ts +4 -0
- package/dist/types/components/Link.d.ts.map +1 -1
- package/dist/types/components/Modal.d.ts +2 -0
- package/dist/types/components/Modal.d.ts.map +1 -1
- package/dist/types/components/Page.d.ts.map +1 -1
- package/dist/types/components/Pane.d.ts +2 -0
- package/dist/types/components/Pane.d.ts.map +1 -1
- package/dist/types/components/TabNavigation.d.ts +3 -0
- package/dist/types/components/TabNavigation.d.ts.map +1 -0
- package/dist/types/components/TextField.d.ts.map +1 -1
- package/dist/types/components/Tip.d.ts.map +1 -1
- package/dist/types/components/Tooltip.d.ts +2 -0
- package/dist/types/components/Tooltip.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/utilities/useBodyScrollLock.d.ts +12 -0
- package/dist/types/utilities/useBodyScrollLock.d.ts.map +1 -0
- package/dist/types/utilities/useKeyboardAction.d.ts +2 -0
- package/dist/types/utilities/useKeyboardAction.d.ts.map +1 -0
- package/dist/types/utilities/useLocalStorage.d.ts +13 -0
- package/dist/types/utilities/useLocalStorage.d.ts.map +1 -0
- package/dist/types/utilities/useMobile.d.ts +9 -0
- package/dist/types/utilities/useMobile.d.ts.map +1 -0
- package/dist/types/utilities/usePaneState.d.ts +2 -0
- package/dist/types/utilities/usePaneState.d.ts.map +1 -0
- package/dist/types/utilities/useTabStorage.d.ts +8 -0
- package/dist/types/utilities/useTabStorage.d.ts.map +1 -0
- package/index.css +77 -6
- package/package.json +1 -1
|
@@ -9,6 +9,9 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
+
get AskModal () {
|
|
13
|
+
return AskModal;
|
|
14
|
+
},
|
|
12
15
|
get CustomLayout () {
|
|
13
16
|
return CustomLayout;
|
|
14
17
|
},
|
|
@@ -21,6 +24,9 @@ _export(exports, {
|
|
|
21
24
|
get FormPane () {
|
|
22
25
|
return FormPane;
|
|
23
26
|
},
|
|
27
|
+
get PinnedTickets () {
|
|
28
|
+
return PinnedTickets;
|
|
29
|
+
},
|
|
24
30
|
get StackedPanes () {
|
|
25
31
|
return StackedPanes;
|
|
26
32
|
},
|
|
@@ -43,6 +49,7 @@ var _TextField = /*#__PURE__*/ _interop_require_default(require("../components/T
|
|
|
43
49
|
var _Page = /*#__PURE__*/ _interop_require_default(require("../components/Page.js"));
|
|
44
50
|
var _Box = /*#__PURE__*/ _interop_require_default(require("../components/Box.js"));
|
|
45
51
|
var _Grid = /*#__PURE__*/ _interop_require_default(require("../components/Grid.js"));
|
|
52
|
+
var _useTabStorage = require("../utilities/useTabStorage.js");
|
|
46
53
|
var _polarisicons = require("@shopify/polaris-icons");
|
|
47
54
|
function _array_like_to_array(arr, len) {
|
|
48
55
|
if (len == null || len > arr.length) len = arr.length;
|
|
@@ -302,6 +309,7 @@ var _default = {
|
|
|
302
309
|
var Default = {
|
|
303
310
|
render: function(args) {
|
|
304
311
|
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
312
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
305
313
|
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Page.default, {
|
|
306
314
|
title: "Pane Demo",
|
|
307
315
|
children: [
|
|
@@ -312,7 +320,7 @@ var Default = {
|
|
|
312
320
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Box.default, {
|
|
313
321
|
paddingBlockEnd: "4",
|
|
314
322
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
315
|
-
children: "Click the button below to open a basic pane with header, content, and footer sections."
|
|
323
|
+
children: "Click the button below to open a basic pane with header, content, and footer sections. The pane now includes tabbed functionality with automatic tab creation."
|
|
316
324
|
})
|
|
317
325
|
}),
|
|
318
326
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
@@ -329,6 +337,9 @@ var Default = {
|
|
|
329
337
|
onClose: function() {
|
|
330
338
|
return setPaneOpen(false);
|
|
331
339
|
},
|
|
340
|
+
tabStorage: tabStorage,
|
|
341
|
+
tabId: "basic-pane",
|
|
342
|
+
tabTitle: "Basic Pane",
|
|
332
343
|
children: [
|
|
333
344
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
334
345
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
@@ -347,7 +358,7 @@ var Default = {
|
|
|
347
358
|
})
|
|
348
359
|
}),
|
|
349
360
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
350
|
-
children: "The pane can be closed by clicking the close button in the
|
|
361
|
+
children: "The pane can be closed by clicking the close button in the tab, pressing the Escape key, or programmatically."
|
|
351
362
|
})
|
|
352
363
|
]
|
|
353
364
|
})
|
|
@@ -385,6 +396,7 @@ var Default = {
|
|
|
385
396
|
var WithActions = {
|
|
386
397
|
render: function() {
|
|
387
398
|
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
399
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
388
400
|
var headerActions = [
|
|
389
401
|
{
|
|
390
402
|
icon: _polarisicons.EditMajor,
|
|
@@ -436,6 +448,9 @@ var WithActions = {
|
|
|
436
448
|
onClose: function() {
|
|
437
449
|
return setPaneOpen(false);
|
|
438
450
|
},
|
|
451
|
+
tabStorage: tabStorage,
|
|
452
|
+
tabId: "product-details",
|
|
453
|
+
tabTitle: "Product Details",
|
|
439
454
|
children: [
|
|
440
455
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
441
456
|
actions: headerActions,
|
|
@@ -568,6 +583,7 @@ var WithActions = {
|
|
|
568
583
|
var FormPane = {
|
|
569
584
|
render: function() {
|
|
570
585
|
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
586
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
571
587
|
var _useState1 = _sliced_to_array((0, _react.useState)({
|
|
572
588
|
name: '',
|
|
573
589
|
email: '',
|
|
@@ -633,6 +649,9 @@ var FormPane = {
|
|
|
633
649
|
onClose: function() {
|
|
634
650
|
return setPaneOpen(false);
|
|
635
651
|
},
|
|
652
|
+
tabStorage: tabStorage,
|
|
653
|
+
tabId: "add-contact",
|
|
654
|
+
tabTitle: "Add New Contact",
|
|
636
655
|
children: [
|
|
637
656
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
638
657
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
@@ -733,6 +752,7 @@ var FormPane = {
|
|
|
733
752
|
var DetailViewPane = {
|
|
734
753
|
render: function() {
|
|
735
754
|
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
755
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
736
756
|
var _useState1 = _sliced_to_array((0, _react.useState)(null), 2), selectedOrder = _useState1[0], setSelectedOrder = _useState1[1];
|
|
737
757
|
var orders = [
|
|
738
758
|
{
|
|
@@ -881,6 +901,9 @@ var DetailViewPane = {
|
|
|
881
901
|
onClose: function() {
|
|
882
902
|
return setPaneOpen(false);
|
|
883
903
|
},
|
|
904
|
+
tabStorage: tabStorage,
|
|
905
|
+
tabId: "order-".concat(selectedOrder === null || selectedOrder === void 0 ? void 0 : selectedOrder.id),
|
|
906
|
+
tabTitle: "Order ".concat(selectedOrder === null || selectedOrder === void 0 ? void 0 : selectedOrder.id),
|
|
884
907
|
children: [
|
|
885
908
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
886
909
|
actions: headerActions,
|
|
@@ -1127,6 +1150,8 @@ var StackedPanes = {
|
|
|
1127
1150
|
render: function() {
|
|
1128
1151
|
var _useState = _sliced_to_array((0, _react.useState)(false), 2), firstPaneOpen = _useState[0], setFirstPaneOpen = _useState[1];
|
|
1129
1152
|
var _useState1 = _sliced_to_array((0, _react.useState)(false), 2), secondPaneOpen = _useState1[0], setSecondPaneOpen = _useState1[1];
|
|
1153
|
+
var firstPaneTabStorage = (0, _useTabStorage.useTabStorage)('stacked-pane-first');
|
|
1154
|
+
var secondPaneTabStorage = (0, _useTabStorage.useTabStorage)('stacked-pane-second');
|
|
1130
1155
|
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Page.default, {
|
|
1131
1156
|
title: "Stacked Panes",
|
|
1132
1157
|
children: [
|
|
@@ -1153,6 +1178,9 @@ var StackedPanes = {
|
|
|
1153
1178
|
onClose: function() {
|
|
1154
1179
|
return setFirstPaneOpen(false);
|
|
1155
1180
|
},
|
|
1181
|
+
tabStorage: firstPaneTabStorage,
|
|
1182
|
+
tabId: "categories",
|
|
1183
|
+
tabTitle: "Categories",
|
|
1156
1184
|
children: [
|
|
1157
1185
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
1158
1186
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
@@ -1227,6 +1255,9 @@ var StackedPanes = {
|
|
|
1227
1255
|
onClose: function() {
|
|
1228
1256
|
return setSecondPaneOpen(false);
|
|
1229
1257
|
},
|
|
1258
|
+
tabStorage: secondPaneTabStorage,
|
|
1259
|
+
tabId: "category-details",
|
|
1260
|
+
tabTitle: "Category Details",
|
|
1230
1261
|
children: [
|
|
1231
1262
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
1232
1263
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
@@ -1349,9 +1380,325 @@ var StackedPanes = {
|
|
|
1349
1380
|
}
|
|
1350
1381
|
}
|
|
1351
1382
|
};
|
|
1383
|
+
var AskModal = {
|
|
1384
|
+
render: function() {
|
|
1385
|
+
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
1386
|
+
var _useState1 = _sliced_to_array((0, _react.useState)("ask"), 2), askContext = _useState1[0], setAskContext = _useState1[1];
|
|
1387
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
1388
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Page.default, {
|
|
1389
|
+
title: "Ask Modal Pane",
|
|
1390
|
+
children: [
|
|
1391
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Card.default, {
|
|
1392
|
+
title: "Ask Modal Example",
|
|
1393
|
+
padded: true,
|
|
1394
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1395
|
+
gap: "4",
|
|
1396
|
+
children: [
|
|
1397
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1398
|
+
children: 'This example demonstrates the AskModal pane type. It creates a single "Ask" tab that can be reused. Opening multiple times will switch to the existing tab instead of creating new ones. The tab title is always "Ask" regardless of the context.'
|
|
1399
|
+
}),
|
|
1400
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1401
|
+
horizontal: true,
|
|
1402
|
+
gap: "4",
|
|
1403
|
+
children: [
|
|
1404
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
1405
|
+
primary: askContext === "ask",
|
|
1406
|
+
onClick: function() {
|
|
1407
|
+
return setAskContext("ask");
|
|
1408
|
+
},
|
|
1409
|
+
children: "Ask Mode"
|
|
1410
|
+
}),
|
|
1411
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
1412
|
+
primary: askContext === "search",
|
|
1413
|
+
onClick: function() {
|
|
1414
|
+
return setAskContext("search");
|
|
1415
|
+
},
|
|
1416
|
+
children: "Search Mode"
|
|
1417
|
+
})
|
|
1418
|
+
]
|
|
1419
|
+
}),
|
|
1420
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
1421
|
+
primary: true,
|
|
1422
|
+
onClick: function() {
|
|
1423
|
+
return setPaneOpen(true);
|
|
1424
|
+
},
|
|
1425
|
+
children: "Open Ask Modal"
|
|
1426
|
+
})
|
|
1427
|
+
]
|
|
1428
|
+
})
|
|
1429
|
+
}),
|
|
1430
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Pane.default, {
|
|
1431
|
+
open: paneOpen,
|
|
1432
|
+
onClose: function() {
|
|
1433
|
+
return setPaneOpen(false);
|
|
1434
|
+
},
|
|
1435
|
+
tabStorage: tabStorage,
|
|
1436
|
+
tabId: "ask-tab",
|
|
1437
|
+
tabTitle: askContext === "search" ? "Search" : "Ask",
|
|
1438
|
+
tabKey: "ask",
|
|
1439
|
+
children: [
|
|
1440
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
1441
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1442
|
+
variant: "headingMd",
|
|
1443
|
+
children: askContext === "search" ? "Search" : "Ask"
|
|
1444
|
+
})
|
|
1445
|
+
}),
|
|
1446
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Content, {
|
|
1447
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Box.default, {
|
|
1448
|
+
padding: "4",
|
|
1449
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1450
|
+
gap: "4",
|
|
1451
|
+
children: [
|
|
1452
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Text.default, {
|
|
1453
|
+
children: [
|
|
1454
|
+
"This is the ",
|
|
1455
|
+
askContext === "search" ? "Search" : "Ask",
|
|
1456
|
+
' modal pane. The tab title will be "',
|
|
1457
|
+
askContext === "search" ? "Search" : "Ask",
|
|
1458
|
+
'" based on the context.'
|
|
1459
|
+
]
|
|
1460
|
+
}),
|
|
1461
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1462
|
+
variant: "bodySm",
|
|
1463
|
+
color: "subdued",
|
|
1464
|
+
children: "Try switching between Ask and Search modes to see the tab title change. Opening multiple times will switch to the existing tab instead of creating duplicates."
|
|
1465
|
+
})
|
|
1466
|
+
]
|
|
1467
|
+
})
|
|
1468
|
+
})
|
|
1469
|
+
}),
|
|
1470
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Footer, {
|
|
1471
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Box.default, {
|
|
1472
|
+
padding: "4",
|
|
1473
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1474
|
+
horizontal: true,
|
|
1475
|
+
gap: "4",
|
|
1476
|
+
align: "end",
|
|
1477
|
+
children: [
|
|
1478
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
1479
|
+
onClick: function() {
|
|
1480
|
+
return setPaneOpen(false);
|
|
1481
|
+
},
|
|
1482
|
+
children: "Close"
|
|
1483
|
+
}),
|
|
1484
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Button.default, {
|
|
1485
|
+
primary: true,
|
|
1486
|
+
onClick: function() {
|
|
1487
|
+
return alert("".concat(askContext, " functionality"));
|
|
1488
|
+
},
|
|
1489
|
+
children: [
|
|
1490
|
+
askContext === "search" ? "Search" : "Ask",
|
|
1491
|
+
" Question"
|
|
1492
|
+
]
|
|
1493
|
+
})
|
|
1494
|
+
]
|
|
1495
|
+
})
|
|
1496
|
+
})
|
|
1497
|
+
})
|
|
1498
|
+
]
|
|
1499
|
+
})
|
|
1500
|
+
]
|
|
1501
|
+
});
|
|
1502
|
+
},
|
|
1503
|
+
parameters: {
|
|
1504
|
+
docs: {
|
|
1505
|
+
description: {
|
|
1506
|
+
story: 'AskModal pane type that creates a reusable "Ask" or "Search" tab based on context. Multiple opens will switch to the existing tab.'
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
};
|
|
1511
|
+
var PinnedTickets = {
|
|
1512
|
+
render: function() {
|
|
1513
|
+
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
1514
|
+
var _useState1 = _sliced_to_array((0, _react.useState)('TICKET-001'), 2), ticketId = _useState1[0], setTicketId = _useState1[1];
|
|
1515
|
+
var _useState2 = _sliced_to_array((0, _react.useState)('John Smith'), 2), customerName = _useState2[0], setCustomerName = _useState2[1];
|
|
1516
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
1517
|
+
var tickets = [
|
|
1518
|
+
{
|
|
1519
|
+
id: 'TICKET-001',
|
|
1520
|
+
customer: 'John Smith',
|
|
1521
|
+
subject: 'Login Issues'
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
id: 'TICKET-002',
|
|
1525
|
+
customer: 'Sarah Johnson',
|
|
1526
|
+
subject: 'Billing Question'
|
|
1527
|
+
},
|
|
1528
|
+
{
|
|
1529
|
+
id: 'TICKET-003',
|
|
1530
|
+
customer: 'Mike Wilson',
|
|
1531
|
+
subject: 'Feature Request'
|
|
1532
|
+
},
|
|
1533
|
+
{
|
|
1534
|
+
id: 'TICKET-004',
|
|
1535
|
+
customer: 'Emily Davis',
|
|
1536
|
+
subject: 'Password Reset'
|
|
1537
|
+
},
|
|
1538
|
+
{
|
|
1539
|
+
id: 'TICKET-005',
|
|
1540
|
+
customer: 'Robert Brown',
|
|
1541
|
+
subject: 'Account Locked'
|
|
1542
|
+
},
|
|
1543
|
+
{
|
|
1544
|
+
id: 'TICKET-006',
|
|
1545
|
+
customer: 'Lisa Anderson',
|
|
1546
|
+
subject: 'Payment Failed'
|
|
1547
|
+
},
|
|
1548
|
+
{
|
|
1549
|
+
id: 'TICKET-007',
|
|
1550
|
+
customer: 'David Miller',
|
|
1551
|
+
subject: 'Refund Request'
|
|
1552
|
+
},
|
|
1553
|
+
{
|
|
1554
|
+
id: 'TICKET-008',
|
|
1555
|
+
customer: 'Jennifer Taylor',
|
|
1556
|
+
subject: 'Shipping Delay'
|
|
1557
|
+
},
|
|
1558
|
+
{
|
|
1559
|
+
id: 'TICKET-009',
|
|
1560
|
+
customer: 'Michael Garcia',
|
|
1561
|
+
subject: 'Product Defect'
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
id: 'TICKET-010',
|
|
1565
|
+
customer: 'Amanda White',
|
|
1566
|
+
subject: 'Subscription Cancel'
|
|
1567
|
+
},
|
|
1568
|
+
{
|
|
1569
|
+
id: 'TICKET-011',
|
|
1570
|
+
customer: 'Christopher Lee',
|
|
1571
|
+
subject: 'Data Export'
|
|
1572
|
+
},
|
|
1573
|
+
{
|
|
1574
|
+
id: 'TICKET-012',
|
|
1575
|
+
customer: 'Jessica Martinez',
|
|
1576
|
+
subject: 'API Integration'
|
|
1577
|
+
}
|
|
1578
|
+
];
|
|
1579
|
+
var handleOpenTicket = function(ticket) {
|
|
1580
|
+
setTicketId(ticket.id);
|
|
1581
|
+
setCustomerName(ticket.customer);
|
|
1582
|
+
setPaneOpen(true);
|
|
1583
|
+
};
|
|
1584
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Page.default, {
|
|
1585
|
+
title: "Pinned Tickets Pane",
|
|
1586
|
+
children: [
|
|
1587
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Card.default, {
|
|
1588
|
+
title: "Pinned Tickets Example",
|
|
1589
|
+
padded: true,
|
|
1590
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1591
|
+
gap: "4",
|
|
1592
|
+
children: [
|
|
1593
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1594
|
+
children: "This example demonstrates the PinnedTicketsPane type. Each ticket creates its own tab with the customer name. Multiple tickets can be pinned simultaneously, each getting their own tab. Opening the same ticket multiple times will switch to the existing tab instead of creating duplicates."
|
|
1595
|
+
}),
|
|
1596
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1597
|
+
variant: "bodySm",
|
|
1598
|
+
color: "subdued",
|
|
1599
|
+
children: "Try clicking the same ticket multiple times - it will switch to the existing tab instead of creating duplicates."
|
|
1600
|
+
}),
|
|
1601
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Stack.default, {
|
|
1602
|
+
gap: "2",
|
|
1603
|
+
children: tickets.map(function(ticket) {
|
|
1604
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Button.default, {
|
|
1605
|
+
onClick: function() {
|
|
1606
|
+
return handleOpenTicket(ticket);
|
|
1607
|
+
},
|
|
1608
|
+
children: [
|
|
1609
|
+
"Open ",
|
|
1610
|
+
ticket.customer,
|
|
1611
|
+
" - ",
|
|
1612
|
+
ticket.subject
|
|
1613
|
+
]
|
|
1614
|
+
}, ticket.id);
|
|
1615
|
+
})
|
|
1616
|
+
})
|
|
1617
|
+
]
|
|
1618
|
+
})
|
|
1619
|
+
}),
|
|
1620
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Pane.default, {
|
|
1621
|
+
open: paneOpen,
|
|
1622
|
+
onClose: function() {
|
|
1623
|
+
return setPaneOpen(false);
|
|
1624
|
+
},
|
|
1625
|
+
tabStorage: tabStorage,
|
|
1626
|
+
tabId: "ticket-".concat(ticketId),
|
|
1627
|
+
tabTitle: customerName,
|
|
1628
|
+
tabKey: "ticket-".concat(ticketId),
|
|
1629
|
+
children: [
|
|
1630
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Header, {
|
|
1631
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1632
|
+
variant: "headingMd",
|
|
1633
|
+
children: customerName
|
|
1634
|
+
})
|
|
1635
|
+
}),
|
|
1636
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Content, {
|
|
1637
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Box.default, {
|
|
1638
|
+
padding: "4",
|
|
1639
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1640
|
+
gap: "4",
|
|
1641
|
+
children: [
|
|
1642
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Text.default, {
|
|
1643
|
+
children: [
|
|
1644
|
+
"This is a pinned ticket for ",
|
|
1645
|
+
customerName,
|
|
1646
|
+
" (Ticket ID: ",
|
|
1647
|
+
ticketId,
|
|
1648
|
+
")."
|
|
1649
|
+
]
|
|
1650
|
+
}),
|
|
1651
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Text.default, {
|
|
1652
|
+
variant: "bodySm",
|
|
1653
|
+
color: "subdued",
|
|
1654
|
+
children: "Each pinned ticket gets its own tab with the customer name as the tab label. Opening the same ticket multiple times will switch to the existing tab instead of creating duplicates."
|
|
1655
|
+
})
|
|
1656
|
+
]
|
|
1657
|
+
})
|
|
1658
|
+
})
|
|
1659
|
+
}),
|
|
1660
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Pane.default.Footer, {
|
|
1661
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_Box.default, {
|
|
1662
|
+
padding: "4",
|
|
1663
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1664
|
+
horizontal: true,
|
|
1665
|
+
gap: "4",
|
|
1666
|
+
align: "end",
|
|
1667
|
+
children: [
|
|
1668
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
1669
|
+
onClick: function() {
|
|
1670
|
+
return setPaneOpen(false);
|
|
1671
|
+
},
|
|
1672
|
+
children: "Close Ticket"
|
|
1673
|
+
}),
|
|
1674
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Button.default, {
|
|
1675
|
+
primary: true,
|
|
1676
|
+
onClick: function() {
|
|
1677
|
+
return alert('Reply to ticket');
|
|
1678
|
+
},
|
|
1679
|
+
children: "Reply"
|
|
1680
|
+
})
|
|
1681
|
+
]
|
|
1682
|
+
})
|
|
1683
|
+
})
|
|
1684
|
+
})
|
|
1685
|
+
]
|
|
1686
|
+
})
|
|
1687
|
+
]
|
|
1688
|
+
});
|
|
1689
|
+
},
|
|
1690
|
+
parameters: {
|
|
1691
|
+
docs: {
|
|
1692
|
+
description: {
|
|
1693
|
+
story: 'PinnedTicketsPane type that creates a separate tab for each pinned ticket with customer name as tab label. Prevents duplicate tabs for the same ticket.'
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
};
|
|
1352
1698
|
var CustomLayout = {
|
|
1353
1699
|
render: function() {
|
|
1354
1700
|
var _useState = _sliced_to_array((0, _react.useState)(false), 2), paneOpen = _useState[0], setPaneOpen = _useState[1];
|
|
1701
|
+
var tabStorage = (0, _useTabStorage.useTabStorage)();
|
|
1355
1702
|
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_Page.default, {
|
|
1356
1703
|
title: "Custom Pane Layout",
|
|
1357
1704
|
children: [
|
|
@@ -1378,10 +1725,12 @@ var CustomLayout = {
|
|
|
1378
1725
|
onClose: function() {
|
|
1379
1726
|
return setPaneOpen(false);
|
|
1380
1727
|
},
|
|
1728
|
+
tabStorage: tabStorage,
|
|
1729
|
+
tabId: "live-chat",
|
|
1730
|
+
tabTitle: "Live Chat Support",
|
|
1381
1731
|
children: [
|
|
1382
1732
|
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Pane.default.Header, {
|
|
1383
1733
|
bottomBorder: false,
|
|
1384
|
-
showCloseButton: false,
|
|
1385
1734
|
children: [
|
|
1386
1735
|
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_Stack.default, {
|
|
1387
1736
|
horizontal: true,
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
function _export(target, all) {
|
|
7
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
_export(exports, {
|
|
13
|
+
get default () {
|
|
14
|
+
return _default;
|
|
15
|
+
},
|
|
16
|
+
get useBodyScrollLock () {
|
|
17
|
+
return useBodyScrollLock;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
var _react = require("react");
|
|
21
|
+
// Reference counter for body scroll lock (shared across all components)
|
|
22
|
+
var bodyScrollLockCount = 0;
|
|
23
|
+
/**
|
|
24
|
+
* Locks body scrolling by adding overflow-hidden class
|
|
25
|
+
* Uses reference counting to coordinate between multiple components
|
|
26
|
+
*/ var lockBodyScroll = function() {
|
|
27
|
+
if (typeof document === 'undefined') return;
|
|
28
|
+
bodyScrollLockCount++;
|
|
29
|
+
if (bodyScrollLockCount === 1) {
|
|
30
|
+
document.body.classList.add('overflow-hidden');
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Unlocks body scrolling by removing overflow-hidden class
|
|
35
|
+
* Uses reference counting to coordinate between multiple components
|
|
36
|
+
*/ var unlockBodyScroll = function() {
|
|
37
|
+
if (typeof document === 'undefined') return;
|
|
38
|
+
bodyScrollLockCount = Math.max(0, bodyScrollLockCount - 1);
|
|
39
|
+
if (bodyScrollLockCount === 0) {
|
|
40
|
+
document.body.classList.remove('overflow-hidden');
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
function useBodyScrollLock(shouldLock) {
|
|
44
|
+
var hasLockedRef = (0, _react.useRef)(false);
|
|
45
|
+
(0, _react.useEffect)(function() {
|
|
46
|
+
if (shouldLock && !hasLockedRef.current) {
|
|
47
|
+
lockBodyScroll();
|
|
48
|
+
hasLockedRef.current = true;
|
|
49
|
+
} else if (!shouldLock && hasLockedRef.current) {
|
|
50
|
+
unlockBodyScroll();
|
|
51
|
+
hasLockedRef.current = false;
|
|
52
|
+
}
|
|
53
|
+
return function() {
|
|
54
|
+
if (hasLockedRef.current) {
|
|
55
|
+
unlockBodyScroll();
|
|
56
|
+
hasLockedRef.current = false;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}, [
|
|
60
|
+
shouldLock
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
var _default = useBodyScrollLock;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "useKeyboardAction", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return useKeyboardAction;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _react = require("react");
|
|
12
|
+
var useKeyboardAction = function() {
|
|
13
|
+
return (0, _react.useCallback)(function(e, action) {
|
|
14
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
action();
|
|
17
|
+
}
|
|
18
|
+
}, []);
|
|
19
|
+
};
|