@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.
Files changed (97) hide show
  1. package/dist/cjs/components/Banner.js +6 -1
  2. package/dist/cjs/components/Button.js +33 -4
  3. package/dist/cjs/components/ButtonGroup.js +19 -4
  4. package/dist/cjs/components/Card.js +39 -3
  5. package/dist/cjs/components/Checkbox.js +13 -2
  6. package/dist/cjs/components/ChoiceList.js +3 -2
  7. package/dist/cjs/components/Code.js +227 -0
  8. package/dist/cjs/components/Filters.js +1 -1
  9. package/dist/cjs/components/Frame.js +2 -2
  10. package/dist/cjs/components/Layout.js +16 -4
  11. package/dist/cjs/components/Link.js +35 -4
  12. package/dist/cjs/components/Modal.js +4 -0
  13. package/dist/cjs/components/Page.js +5 -2
  14. package/dist/cjs/components/Pane.js +669 -84
  15. package/dist/cjs/components/ResourceList.js +2 -2
  16. package/dist/cjs/components/TabNavigation.js +300 -0
  17. package/dist/cjs/components/TextField.js +3 -0
  18. package/dist/cjs/components/Tip.js +3 -0
  19. package/dist/cjs/components/Tooltip.js +12 -13
  20. package/dist/cjs/index.js +4 -0
  21. package/dist/cjs/stories/Checkbox.stories.js +172 -1
  22. package/dist/cjs/stories/Pane.stories.js +352 -3
  23. package/dist/cjs/utilities/useBodyScrollLock.js +63 -0
  24. package/dist/cjs/utilities/useKeyboardAction.js +19 -0
  25. package/dist/cjs/utilities/useLocalStorage.js +126 -0
  26. package/dist/cjs/utilities/useMobile.js +92 -0
  27. package/dist/cjs/utilities/usePaneState.js +340 -0
  28. package/dist/cjs/utilities/useTabStorage.js +325 -0
  29. package/dist/esm/components/Banner.js +7 -2
  30. package/dist/esm/components/Button.js +33 -4
  31. package/dist/esm/components/ButtonGroup.js +19 -4
  32. package/dist/esm/components/Card.js +39 -3
  33. package/dist/esm/components/Checkbox.js +13 -2
  34. package/dist/esm/components/ChoiceList.js +3 -2
  35. package/dist/esm/components/Code.js +212 -0
  36. package/dist/esm/components/Filters.js +2 -2
  37. package/dist/esm/components/Frame.js +2 -2
  38. package/dist/esm/components/Layout.js +16 -4
  39. package/dist/esm/components/Link.js +31 -5
  40. package/dist/esm/components/Modal.js +4 -0
  41. package/dist/esm/components/Page.js +5 -2
  42. package/dist/esm/components/Pane.js +619 -83
  43. package/dist/esm/components/ResourceList.js +2 -2
  44. package/dist/esm/components/TabNavigation.js +285 -0
  45. package/dist/esm/components/TextField.js +4 -1
  46. package/dist/esm/components/Tip.js +4 -1
  47. package/dist/esm/components/Tooltip.js +12 -13
  48. package/dist/esm/index.js +1 -0
  49. package/dist/esm/stories/Checkbox.stories.js +166 -1
  50. package/dist/esm/stories/Pane.stories.js +346 -3
  51. package/dist/esm/utilities/useBodyScrollLock.js +53 -0
  52. package/dist/esm/utilities/useKeyboardAction.js +25 -0
  53. package/dist/esm/utilities/useLocalStorage.js +115 -0
  54. package/dist/esm/utilities/useMobile.js +79 -0
  55. package/dist/esm/utilities/usePaneState.js +334 -0
  56. package/dist/esm/utilities/useTabStorage.js +311 -0
  57. package/dist/types/components/Banner.d.ts.map +1 -1
  58. package/dist/types/components/Button.d.ts +2 -2
  59. package/dist/types/components/Button.d.ts.map +1 -1
  60. package/dist/types/components/ButtonGroup.d.ts.map +1 -1
  61. package/dist/types/components/Card.d.ts +34 -1
  62. package/dist/types/components/Card.d.ts.map +1 -1
  63. package/dist/types/components/Checkbox.d.ts +11 -2
  64. package/dist/types/components/Checkbox.d.ts.map +1 -1
  65. package/dist/types/components/Code.d.ts +28 -0
  66. package/dist/types/components/Code.d.ts.map +1 -0
  67. package/dist/types/components/Filters.d.ts.map +1 -1
  68. package/dist/types/components/Layout.d.ts +2 -0
  69. package/dist/types/components/Layout.d.ts.map +1 -1
  70. package/dist/types/components/Link.d.ts +4 -0
  71. package/dist/types/components/Link.d.ts.map +1 -1
  72. package/dist/types/components/Modal.d.ts +2 -0
  73. package/dist/types/components/Modal.d.ts.map +1 -1
  74. package/dist/types/components/Page.d.ts.map +1 -1
  75. package/dist/types/components/Pane.d.ts +2 -0
  76. package/dist/types/components/Pane.d.ts.map +1 -1
  77. package/dist/types/components/TabNavigation.d.ts +3 -0
  78. package/dist/types/components/TabNavigation.d.ts.map +1 -0
  79. package/dist/types/components/TextField.d.ts.map +1 -1
  80. package/dist/types/components/Tip.d.ts.map +1 -1
  81. package/dist/types/components/Tooltip.d.ts +2 -0
  82. package/dist/types/components/Tooltip.d.ts.map +1 -1
  83. package/dist/types/index.d.ts +1 -0
  84. package/dist/types/utilities/useBodyScrollLock.d.ts +12 -0
  85. package/dist/types/utilities/useBodyScrollLock.d.ts.map +1 -0
  86. package/dist/types/utilities/useKeyboardAction.d.ts +2 -0
  87. package/dist/types/utilities/useKeyboardAction.d.ts.map +1 -0
  88. package/dist/types/utilities/useLocalStorage.d.ts +13 -0
  89. package/dist/types/utilities/useLocalStorage.d.ts.map +1 -0
  90. package/dist/types/utilities/useMobile.d.ts +9 -0
  91. package/dist/types/utilities/useMobile.d.ts.map +1 -0
  92. package/dist/types/utilities/usePaneState.d.ts +2 -0
  93. package/dist/types/utilities/usePaneState.d.ts.map +1 -0
  94. package/dist/types/utilities/useTabStorage.d.ts +8 -0
  95. package/dist/types/utilities/useTabStorage.d.ts.map +1 -0
  96. package/index.css +77 -6
  97. 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 header, pressing the Escape key, or programmatically."
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
+ };