@smwb/ui-solid 0.13.0 → 0.14.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/README.md +564 -0
- package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
- package/dist/assets/styles/less/components/button/button.entry.css +1 -1
- package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
- package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
- package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
- package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
- package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
- package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
- package/dist/assets/styles/less/components/list/list.entry.css +1 -1
- package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
- package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
- package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
- package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
- package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
- package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
- package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
- package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
- package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
- package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
- package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
- package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
- package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
- package/dist/assets/styles/less/tokens.entry.css +1 -1
- package/dist/components/dataDisplay/chat/chat.d.ts +42 -0
- package/dist/components/dataDisplay/chat/chat.js +116 -57
- package/dist/components/dataDisplay/chat/chat.js.map +1 -1
- package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
- package/dist/components/dataDisplay/chat/chatComposer.js +21 -19
- package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
- package/dist/components/dataDisplay/chat/index.d.ts +1 -1
- package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
- package/dist/components/dataDisplay/chat/utils.js.map +1 -1
- package/dist/components/dataDisplay/dagView/dagView.js +238 -223
- package/dist/components/dataDisplay/dagView/dagView.js.map +1 -1
- package/dist/components/dataDisplay/diffStat/diffStat.d.ts +55 -0
- package/dist/components/dataDisplay/diffStat/diffStat.js +70 -0
- package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
- package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
- package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
- package/dist/components/dataDisplay/kbd/kbd.d.ts +41 -0
- package/dist/components/dataDisplay/kbd/kbd.js +47 -0
- package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
- package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
- package/dist/components/dataDisplay/kbd/kbdKeys.js +70 -0
- package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
- package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
- package/dist/components/dataDisplay/list/listItem.js +57 -20
- package/dist/components/dataDisplay/list/listItem.js.map +1 -1
- package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
- package/dist/components/dataDisplay/qrCode/qrCode.d.ts +30 -0
- package/dist/components/dataDisplay/qrCode/qrCode.js +88 -0
- package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
- package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
- package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
- package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
- package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
- package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
- package/dist/components/dataDisplay/statusDot/statusDot.js +31 -0
- package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
- package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
- package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +75 -0
- package/dist/components/dataDisplay/swimlanes/swimlanes.js +361 -0
- package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
- package/dist/components/dataDisplay/treeView/treeView.d.ts +20 -0
- package/dist/components/dataDisplay/treeView/treeView.js +161 -95
- package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
- package/dist/components/feedBack/modal/modal.d.ts +9 -0
- package/dist/components/feedBack/modal/modal.js +68 -54
- package/dist/components/feedBack/modal/modal.js.map +1 -1
- package/dist/components/inputs/button/button.d.ts +12 -0
- package/dist/components/inputs/button/button.js +44 -37
- package/dist/components/inputs/button/button.js.map +1 -1
- package/dist/components/inputs/composer/composer.d.ts +148 -0
- package/dist/components/inputs/composer/composer.js +276 -0
- package/dist/components/inputs/composer/composer.js.map +1 -0
- package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
- package/dist/components/inputs/composer/composerFiles.js +18 -0
- package/dist/components/inputs/composer/composerFiles.js.map +1 -0
- package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
- package/dist/components/inputs/composer/composerKeys.js +7 -0
- package/dist/components/inputs/composer/composerKeys.js.map +1 -0
- package/dist/components/inputs/composer/index.d.ts +3 -0
- package/dist/components/layout/sheet/sheet.d.ts +12 -0
- package/dist/components/layout/sheet/sheet.js +100 -86
- package/dist/components/layout/sheet/sheet.js.map +1 -1
- package/dist/components/layout/tabGroups/index.d.ts +4 -0
- package/dist/components/layout/tabGroups/tabGroups.d.ts +102 -0
- package/dist/components/layout/tabGroups/tabGroups.js +895 -0
- package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
- package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
- package/dist/components/layout/tabGroups/tabGroupsFocus.js +192 -0
- package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
- package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
- package/dist/components/layout/tabGroups/tabGroupsLayout.js +480 -0
- package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
- package/dist/components/navigation/appBar/appBar.d.ts +22 -0
- package/dist/components/navigation/appBar/appBar.js +60 -22
- package/dist/components/navigation/appBar/appBar.js.map +1 -1
- package/dist/components/navigation/commandPalette/commandPalette.d.ts +126 -0
- package/dist/components/navigation/commandPalette/commandPalette.js +457 -0
- package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
- package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
- package/dist/components/navigation/commandPalette/commandPaletteFilter.js +15 -0
- package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
- package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
- package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
- package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
- package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
- package/dist/components/navigation/commandPalette/index.d.ts +6 -0
- package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
- package/dist/components/navigation/sidebar/sidebar.js +12 -10
- package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
- package/dist/components/navigation/tabs/index.d.ts +3 -1
- package/dist/components/navigation/tabs/tab/tab.d.ts +89 -2
- package/dist/components/navigation/tabs/tab/tab.js +164 -44
- package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
- package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +20 -0
- package/dist/components/navigation/tabs/tabPanel/tabPanel.js +34 -0
- package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
- package/dist/components/navigation/tabs/tabs.d.ts +73 -3
- package/dist/components/navigation/tabs/tabs.js +387 -160
- package/dist/components/navigation/tabs/tabs.js.map +1 -1
- package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
- package/dist/components/navigation/tabs/tabs.utils.js +11 -0
- package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
- package/dist/components/navigation/tabs/tabsContext.d.ts +31 -1
- package/dist/components/navigation/tabs/tabsContext.js.map +1 -1
- package/dist/headless/components/dataDisplay/chat/chat.js +116 -57
- package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
- package/dist/headless/components/dataDisplay/chat/chatComposer.js +21 -19
- package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
- package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
- package/dist/headless/components/dataDisplay/dagView/dagView.js +238 -223
- package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -1
- package/dist/headless/components/dataDisplay/diffStat/diffStat.js +68 -0
- package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
- package/dist/headless/components/dataDisplay/kbd/kbd.js +45 -0
- package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
- package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +70 -0
- package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
- package/dist/headless/components/dataDisplay/list/listItem.js +57 -20
- package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
- package/dist/headless/components/dataDisplay/qrCode/qrCode.js +86 -0
- package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
- package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
- package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
- package/dist/headless/components/dataDisplay/statusDot/statusDot.js +29 -0
- package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
- package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +359 -0
- package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
- package/dist/headless/components/dataDisplay/treeView/treeView.js +161 -95
- package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
- package/dist/headless/components/feedBack/modal/modal.js +68 -54
- package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
- package/dist/headless/components/inputs/button/button.js +42 -35
- package/dist/headless/components/inputs/button/button.js.map +1 -1
- package/dist/headless/components/inputs/composer/composer.js +274 -0
- package/dist/headless/components/inputs/composer/composer.js.map +1 -0
- package/dist/headless/components/inputs/composer/composerFiles.js +18 -0
- package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
- package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
- package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
- package/dist/headless/components/layout/sheet/sheet.js +100 -86
- package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
- package/dist/headless/components/layout/tabGroups/tabGroups.js +893 -0
- package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
- package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +192 -0
- package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
- package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +480 -0
- package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
- package/dist/headless/components/navigation/appBar/appBar.js +64 -26
- package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
- package/dist/headless/components/navigation/commandPalette/commandPalette.js +455 -0
- package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
- package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +15 -0
- package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
- package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
- package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
- package/dist/headless/components/navigation/sidebar/sidebar.js +28 -26
- package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
- package/dist/headless/components/navigation/tabs/tab/tab.js +164 -44
- package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
- package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +32 -0
- package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
- package/dist/headless/components/navigation/tabs/tabs.js +387 -160
- package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
- package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
- package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
- package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -1
- package/dist/headless/index.js +405 -367
- package/dist/headless/index.js.map +1 -1
- package/dist/headless/primitives/createFocusTrap.js +17 -17
- package/dist/headless/primitives/createFocusTrap.js.map +1 -1
- package/dist/headless/primitives/createKeyboardShortcut.js +16 -0
- package/dist/headless/primitives/createKeyboardShortcut.js.map +1 -0
- package/dist/headless/primitives/restoreFocus.js +10 -0
- package/dist/headless/primitives/restoreFocus.js.map +1 -0
- package/dist/headless/source/components/dataDisplay/chat/chat.jsx +38 -4
- package/dist/headless/source/components/dataDisplay/chat/chat.jsx.map +1 -1
- package/dist/headless/source/components/dataDisplay/chat/chatComposer.jsx +1 -0
- package/dist/headless/source/components/dataDisplay/chat/chatComposer.jsx.map +1 -1
- package/dist/headless/source/components/dataDisplay/chat/index.js.map +1 -1
- package/dist/headless/source/components/dataDisplay/chat/utils.js.map +2 -2
- package/dist/headless/source/components/dataDisplay/dagView/dagView.jsx +30 -21
- package/dist/headless/source/components/dataDisplay/dagView/dagView.jsx.map +1 -1
- package/dist/headless/source/components/dataDisplay/diffStat/diffStat.jsx +76 -0
- package/dist/headless/source/components/dataDisplay/diffStat/diffStat.jsx.map +1 -0
- package/dist/headless/source/components/dataDisplay/diffStat/index.js +19 -0
- package/dist/headless/source/components/dataDisplay/diffStat/index.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/kbd/index.js +9 -0
- package/dist/headless/source/components/dataDisplay/kbd/index.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/kbd/kbd.jsx +48 -0
- package/dist/headless/source/components/dataDisplay/kbd/kbd.jsx.map +1 -0
- package/dist/headless/source/components/dataDisplay/kbd/kbdKeys.js +79 -0
- package/dist/headless/source/components/dataDisplay/kbd/kbdKeys.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/list/listItem.jsx +37 -7
- package/dist/headless/source/components/dataDisplay/list/listItem.jsx.map +1 -1
- package/dist/headless/source/components/dataDisplay/qrCode/index.js +6 -0
- package/dist/headless/source/components/dataDisplay/qrCode/index.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/qrCode/qrCode.jsx +94 -0
- package/dist/headless/source/components/dataDisplay/qrCode/qrCode.jsx.map +1 -0
- package/dist/headless/source/components/dataDisplay/qrCode/qrCodePath.js +24 -0
- package/dist/headless/source/components/dataDisplay/qrCode/qrCodePath.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/statusDot/index.js +6 -0
- package/dist/headless/source/components/dataDisplay/statusDot/index.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/statusDot/statusDot.jsx +28 -0
- package/dist/headless/source/components/dataDisplay/statusDot/statusDot.jsx.map +1 -0
- package/dist/headless/source/components/dataDisplay/swimlanes/index.js +15 -0
- package/dist/headless/source/components/dataDisplay/swimlanes/index.js.map +7 -0
- package/dist/headless/source/components/dataDisplay/swimlanes/swimlanes.jsx +450 -0
- package/dist/headless/source/components/dataDisplay/swimlanes/swimlanes.jsx.map +1 -0
- package/dist/headless/source/components/dataDisplay/treeView/treeView.jsx +118 -37
- package/dist/headless/source/components/dataDisplay/treeView/treeView.jsx.map +1 -1
- package/dist/headless/source/components/feedBack/modal/modal.jsx +34 -4
- package/dist/headless/source/components/feedBack/modal/modal.jsx.map +1 -1
- package/dist/headless/source/components/inputs/button/button.jsx +6 -2
- package/dist/headless/source/components/inputs/button/button.jsx.map +1 -1
- package/dist/headless/source/components/inputs/composer/composer.jsx +319 -0
- package/dist/headless/source/components/inputs/composer/composer.jsx.map +1 -0
- package/dist/headless/source/components/inputs/composer/composerFiles.js +27 -0
- package/dist/headless/source/components/inputs/composer/composerFiles.js.map +7 -0
- package/dist/headless/source/components/inputs/composer/composerKeys.js +11 -0
- package/dist/headless/source/components/inputs/composer/composerKeys.js.map +7 -0
- package/dist/headless/source/components/inputs/composer/index.js +5 -0
- package/dist/headless/source/components/inputs/composer/index.js.map +7 -0
- package/dist/headless/source/components/layout/sheet/sheet.jsx +33 -11
- package/dist/headless/source/components/layout/sheet/sheet.jsx.map +1 -1
- package/dist/headless/source/components/layout/tabGroups/index.js +8 -0
- package/dist/headless/source/components/layout/tabGroups/index.js.map +7 -0
- package/dist/headless/source/components/layout/tabGroups/tabGroups.jsx +1117 -0
- package/dist/headless/source/components/layout/tabGroups/tabGroups.jsx.map +1 -0
- package/dist/headless/source/components/layout/tabGroups/tabGroupsFocus.js +222 -0
- package/dist/headless/source/components/layout/tabGroups/tabGroupsFocus.js.map +7 -0
- package/dist/headless/source/components/layout/tabGroups/tabGroupsLayout.js +629 -0
- package/dist/headless/source/components/layout/tabGroups/tabGroupsLayout.js.map +7 -0
- package/dist/headless/source/components/navigation/appBar/appBar.jsx +27 -3
- package/dist/headless/source/components/navigation/appBar/appBar.jsx.map +1 -1
- package/dist/headless/source/components/navigation/commandPalette/commandPalette.jsx +506 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPalette.jsx.map +1 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPaletteFilter.js.map +7 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPaletteNavigation.js +54 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPaletteNavigation.js.map +7 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPaletteTypes.js +1 -0
- package/dist/headless/source/components/navigation/commandPalette/commandPaletteTypes.js.map +7 -0
- package/dist/headless/source/components/navigation/commandPalette/index.js +11 -0
- package/dist/headless/source/components/navigation/commandPalette/index.js.map +7 -0
- package/dist/headless/source/components/navigation/sidebar/sidebar.jsx +5 -2
- package/dist/headless/source/components/navigation/sidebar/sidebar.jsx.map +1 -1
- package/dist/headless/source/components/navigation/tabs/index.js +2 -0
- package/dist/headless/source/components/navigation/tabs/index.js.map +2 -2
- package/dist/headless/source/components/navigation/tabs/tab/tab.jsx +135 -8
- package/dist/headless/source/components/navigation/tabs/tab/tab.jsx.map +1 -1
- package/dist/headless/source/components/navigation/tabs/tabPanel/tabPanel.jsx +28 -0
- package/dist/headless/source/components/navigation/tabs/tabPanel/tabPanel.jsx.map +1 -0
- package/dist/headless/source/components/navigation/tabs/tabs.jsx +361 -13
- package/dist/headless/source/components/navigation/tabs/tabs.jsx.map +1 -1
- package/dist/headless/source/components/navigation/tabs/tabs.utils.js +18 -0
- package/dist/headless/source/components/navigation/tabs/tabs.utils.js.map +7 -0
- package/dist/headless/source/components/navigation/tabs/tabsContext.js.map +2 -2
- package/dist/headless/source/index.js +41 -1
- package/dist/headless/source/index.js.map +2 -2
- package/dist/headless/source/primitives/createFocusTrap.js +8 -3
- package/dist/headless/source/primitives/createFocusTrap.js.map +2 -2
- package/dist/headless/source/primitives/createKeyboardShortcut.js +23 -0
- package/dist/headless/source/primitives/createKeyboardShortcut.js.map +7 -0
- package/dist/headless/source/primitives/restoreFocus.js +14 -0
- package/dist/headless/source/primitives/restoreFocus.js.map +7 -0
- package/dist/headless/source/utils/keyboardShortcut.js +74 -0
- package/dist/headless/source/utils/keyboardShortcut.js.map +7 -0
- package/dist/headless/source/utils/linkAttrs.js +16 -0
- package/dist/headless/source/utils/linkAttrs.js.map +7 -0
- package/dist/headless/utils/keyboardShortcut.js +48 -0
- package/dist/headless/utils/keyboardShortcut.js.map +1 -0
- package/dist/headless/utils/linkAttrs.js +13 -0
- package/dist/headless/utils/linkAttrs.js.map +1 -0
- package/dist/index.d.ts +24 -3
- package/dist/index.js +405 -367
- package/dist/index.js.map +1 -1
- package/dist/primitives/createFocusTrap.d.ts +5 -0
- package/dist/primitives/createFocusTrap.js +17 -17
- package/dist/primitives/createFocusTrap.js.map +1 -1
- package/dist/primitives/createKeyboardShortcut.d.ts +23 -0
- package/dist/primitives/createKeyboardShortcut.js +16 -0
- package/dist/primitives/createKeyboardShortcut.js.map +1 -0
- package/dist/primitives/restoreFocus.d.ts +8 -0
- package/dist/primitives/restoreFocus.js +10 -0
- package/dist/primitives/restoreFocus.js.map +1 -0
- package/dist/source/components/dataDisplay/chat/chat.jsx +38 -4
- package/dist/source/components/dataDisplay/chat/chat.jsx.map +1 -1
- package/dist/source/components/dataDisplay/chat/chatComposer.jsx +1 -0
- package/dist/source/components/dataDisplay/chat/chatComposer.jsx.map +1 -1
- package/dist/source/components/dataDisplay/chat/index.js.map +1 -1
- package/dist/source/components/dataDisplay/chat/utils.js.map +2 -2
- package/dist/source/components/dataDisplay/dagView/dagView.jsx +30 -21
- package/dist/source/components/dataDisplay/dagView/dagView.jsx.map +1 -1
- package/dist/source/components/dataDisplay/diffStat/diffStat.jsx +78 -0
- package/dist/source/components/dataDisplay/diffStat/diffStat.jsx.map +1 -0
- package/dist/source/components/dataDisplay/diffStat/index.js +19 -0
- package/dist/source/components/dataDisplay/diffStat/index.js.map +7 -0
- package/dist/source/components/dataDisplay/kbd/index.js +9 -0
- package/dist/source/components/dataDisplay/kbd/index.js.map +7 -0
- package/dist/source/components/dataDisplay/kbd/kbd.jsx +50 -0
- package/dist/source/components/dataDisplay/kbd/kbd.jsx.map +1 -0
- package/dist/source/components/dataDisplay/kbd/kbdKeys.js +79 -0
- package/dist/source/components/dataDisplay/kbd/kbdKeys.js.map +7 -0
- package/dist/source/components/dataDisplay/list/listItem.jsx +37 -7
- package/dist/source/components/dataDisplay/list/listItem.jsx.map +1 -1
- package/dist/source/components/dataDisplay/qrCode/index.js +6 -0
- package/dist/source/components/dataDisplay/qrCode/index.js.map +7 -0
- package/dist/source/components/dataDisplay/qrCode/qrCode.jsx +96 -0
- package/dist/source/components/dataDisplay/qrCode/qrCode.jsx.map +1 -0
- package/dist/source/components/dataDisplay/qrCode/qrCodePath.js +24 -0
- package/dist/source/components/dataDisplay/qrCode/qrCodePath.js.map +7 -0
- package/dist/source/components/dataDisplay/statusDot/index.js +6 -0
- package/dist/source/components/dataDisplay/statusDot/index.js.map +7 -0
- package/dist/source/components/dataDisplay/statusDot/statusDot.jsx +30 -0
- package/dist/source/components/dataDisplay/statusDot/statusDot.jsx.map +1 -0
- package/dist/source/components/dataDisplay/swimlanes/index.js +15 -0
- package/dist/source/components/dataDisplay/swimlanes/index.js.map +7 -0
- package/dist/source/components/dataDisplay/swimlanes/swimlanes.jsx +452 -0
- package/dist/source/components/dataDisplay/swimlanes/swimlanes.jsx.map +1 -0
- package/dist/source/components/dataDisplay/treeView/treeView.jsx +118 -37
- package/dist/source/components/dataDisplay/treeView/treeView.jsx.map +1 -1
- package/dist/source/components/feedBack/modal/modal.jsx +34 -4
- package/dist/source/components/feedBack/modal/modal.jsx.map +1 -1
- package/dist/source/components/inputs/button/button.jsx +6 -2
- package/dist/source/components/inputs/button/button.jsx.map +1 -1
- package/dist/source/components/inputs/composer/composer.jsx +321 -0
- package/dist/source/components/inputs/composer/composer.jsx.map +1 -0
- package/dist/source/components/inputs/composer/composerFiles.js +27 -0
- package/dist/source/components/inputs/composer/composerFiles.js.map +7 -0
- package/dist/source/components/inputs/composer/composerKeys.js +11 -0
- package/dist/source/components/inputs/composer/composerKeys.js.map +7 -0
- package/dist/source/components/inputs/composer/index.js +5 -0
- package/dist/source/components/inputs/composer/index.js.map +7 -0
- package/dist/source/components/layout/sheet/sheet.jsx +33 -11
- package/dist/source/components/layout/sheet/sheet.jsx.map +1 -1
- package/dist/source/components/layout/tabGroups/index.js +8 -0
- package/dist/source/components/layout/tabGroups/index.js.map +7 -0
- package/dist/source/components/layout/tabGroups/tabGroups.jsx +1119 -0
- package/dist/source/components/layout/tabGroups/tabGroups.jsx.map +1 -0
- package/dist/source/components/layout/tabGroups/tabGroupsFocus.js +222 -0
- package/dist/source/components/layout/tabGroups/tabGroupsFocus.js.map +7 -0
- package/dist/source/components/layout/tabGroups/tabGroupsLayout.js +629 -0
- package/dist/source/components/layout/tabGroups/tabGroupsLayout.js.map +7 -0
- package/dist/source/components/navigation/appBar/appBar.jsx +27 -3
- package/dist/source/components/navigation/appBar/appBar.jsx.map +1 -1
- package/dist/source/components/navigation/commandPalette/commandPalette.jsx +508 -0
- package/dist/source/components/navigation/commandPalette/commandPalette.jsx.map +1 -0
- package/dist/source/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
- package/dist/source/components/navigation/commandPalette/commandPaletteFilter.js.map +7 -0
- package/dist/source/components/navigation/commandPalette/commandPaletteNavigation.js +54 -0
- package/dist/source/components/navigation/commandPalette/commandPaletteNavigation.js.map +7 -0
- package/dist/source/components/navigation/commandPalette/commandPaletteTypes.js +1 -0
- package/dist/source/components/navigation/commandPalette/commandPaletteTypes.js.map +7 -0
- package/dist/source/components/navigation/commandPalette/index.js +11 -0
- package/dist/source/components/navigation/commandPalette/index.js.map +7 -0
- package/dist/source/components/navigation/sidebar/sidebar.jsx +5 -2
- package/dist/source/components/navigation/sidebar/sidebar.jsx.map +1 -1
- package/dist/source/components/navigation/tabs/index.js +2 -0
- package/dist/source/components/navigation/tabs/index.js.map +2 -2
- package/dist/source/components/navigation/tabs/tab/tab.jsx +135 -8
- package/dist/source/components/navigation/tabs/tab/tab.jsx.map +1 -1
- package/dist/source/components/navigation/tabs/tabPanel/tabPanel.jsx +30 -0
- package/dist/source/components/navigation/tabs/tabPanel/tabPanel.jsx.map +1 -0
- package/dist/source/components/navigation/tabs/tabs.jsx +361 -13
- package/dist/source/components/navigation/tabs/tabs.jsx.map +1 -1
- package/dist/source/components/navigation/tabs/tabs.utils.js +18 -0
- package/dist/source/components/navigation/tabs/tabs.utils.js.map +7 -0
- package/dist/source/components/navigation/tabs/tabsContext.js.map +2 -2
- package/dist/source/index.js +41 -1
- package/dist/source/index.js.map +2 -2
- package/dist/source/primitives/createFocusTrap.js +8 -3
- package/dist/source/primitives/createFocusTrap.js.map +2 -2
- package/dist/source/primitives/createKeyboardShortcut.js +23 -0
- package/dist/source/primitives/createKeyboardShortcut.js.map +7 -0
- package/dist/source/primitives/restoreFocus.js +14 -0
- package/dist/source/primitives/restoreFocus.js.map +7 -0
- package/dist/source/utils/keyboardShortcut.js +74 -0
- package/dist/source/utils/keyboardShortcut.js.map +7 -0
- package/dist/source/utils/linkAttrs.js +16 -0
- package/dist/source/utils/linkAttrs.js.map +7 -0
- package/dist/utils/keyboardShortcut.d.ts +12 -0
- package/dist/utils/keyboardShortcut.js +48 -0
- package/dist/utils/keyboardShortcut.js.map +1 -0
- package/dist/utils/linkAttrs.d.ts +13 -0
- package/dist/utils/linkAttrs.js +13 -0
- package/dist/utils/linkAttrs.js.map +1 -0
- package/package.json +66 -3
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Show,
|
|
3
|
+
batch,
|
|
4
|
+
createEffect,
|
|
5
|
+
createMemo,
|
|
6
|
+
createRenderEffect,
|
|
7
|
+
createSelector,
|
|
8
|
+
createSignal,
|
|
9
|
+
mapArray,
|
|
10
|
+
mergeProps,
|
|
11
|
+
on,
|
|
12
|
+
onCleanup,
|
|
13
|
+
onMount,
|
|
14
|
+
splitProps,
|
|
15
|
+
untrack
|
|
16
|
+
} from "solid-js";
|
|
17
|
+
import { isServer } from "solid-js/web";
|
|
18
|
+
import cn from "clsx";
|
|
19
|
+
import { callHandler } from "../../../primitives/callHandler";
|
|
20
|
+
import { createControllableState } from "../../../primitives/createControllableState";
|
|
21
|
+
import { createVirtualList } from "../../../primitives/createVirtualList";
|
|
22
|
+
import { mergeRefs } from "../../../primitives/mergeRefs";
|
|
23
|
+
import { mergeStyle } from "../../../primitives/mergeStyle";
|
|
24
|
+
import { isOwnClick } from "../../../utils/ownClick";
|
|
25
|
+
const SWIMLANES_DEFAULT_ROW_HEIGHT = 64;
|
|
26
|
+
const SWIMLANES_DEFAULT_HEIGHT = 480;
|
|
27
|
+
const SWIMLANES_DEFAULT_OVERSCAN = 4;
|
|
28
|
+
const INNER_FOCUSABLE = 'a[href], button, input, select, textarea, iframe, summary, audio[controls], video[controls], [tabindex], [contenteditable]:not([contenteditable="false"])';
|
|
29
|
+
const CELLS = ".smwb-swimlanes__header, .smwb-swimlanes__content";
|
|
30
|
+
const cssLength = (value) => typeof value === "number" ? `${value}px` : value;
|
|
31
|
+
function swimlanesKeyTarget(key, mods, from, context) {
|
|
32
|
+
const last = context.count - 1;
|
|
33
|
+
if (last < 0) return null;
|
|
34
|
+
const clamp = (index) => Math.min(last, Math.max(0, index));
|
|
35
|
+
const lane = (index) => index === from.index ? null : { index, col: from.col };
|
|
36
|
+
const column = (col) => col === from.col ? null : { index: from.index, col };
|
|
37
|
+
if (mods.ctrlKey || mods.metaKey || mods.altKey) {
|
|
38
|
+
if (!mods.ctrlKey || mods.metaKey || mods.altKey) return null;
|
|
39
|
+
if (key === "Home") return lane(0);
|
|
40
|
+
if (key === "End") return lane(last);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
switch (key) {
|
|
44
|
+
case "ArrowDown":
|
|
45
|
+
return lane(clamp(from.index + 1));
|
|
46
|
+
case "ArrowUp":
|
|
47
|
+
return lane(clamp(from.index - 1));
|
|
48
|
+
case "ArrowRight":
|
|
49
|
+
return column(1);
|
|
50
|
+
case "ArrowLeft":
|
|
51
|
+
return column(0);
|
|
52
|
+
case "Home":
|
|
53
|
+
return column(0);
|
|
54
|
+
case "End":
|
|
55
|
+
return column(1);
|
|
56
|
+
case "PageDown":
|
|
57
|
+
return lane(clamp(from.index + context.pageSize));
|
|
58
|
+
case "PageUp":
|
|
59
|
+
return lane(clamp(from.index - context.pageSize));
|
|
60
|
+
default:
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function placeRows(parent, next) {
|
|
65
|
+
const wanted = new Set(next);
|
|
66
|
+
for (const child of Array.from(parent.children)) if (!wanted.has(child)) child.remove();
|
|
67
|
+
const position = /* @__PURE__ */ new Map();
|
|
68
|
+
Array.from(parent.children).forEach((child, at) => position.set(child, at));
|
|
69
|
+
const active = parent.ownerDocument.activeElement;
|
|
70
|
+
const focused = active === null ? -1 : next.findIndex((row) => row.contains(active));
|
|
71
|
+
const focusedAt = focused < 0 ? void 0 : position.get(next[focused]);
|
|
72
|
+
const kept = [];
|
|
73
|
+
next.forEach((row, i) => {
|
|
74
|
+
const at = position.get(row);
|
|
75
|
+
if (at === void 0) return;
|
|
76
|
+
if (focusedAt !== void 0 && i !== focused && i < focused !== at < focusedAt) return;
|
|
77
|
+
kept.push(at);
|
|
78
|
+
});
|
|
79
|
+
const length = kept.map(() => 1);
|
|
80
|
+
const previous = kept.map(() => -1);
|
|
81
|
+
let best = -1;
|
|
82
|
+
kept.forEach((at, k) => {
|
|
83
|
+
for (let j = 0; j < k; j++) {
|
|
84
|
+
if (kept[j] < at && length[j] + 1 > length[k]) {
|
|
85
|
+
length[k] = length[j] + 1;
|
|
86
|
+
previous[k] = j;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (best < 0 || length[k] > length[best]) best = k;
|
|
90
|
+
});
|
|
91
|
+
const stays = /* @__PURE__ */ new Set();
|
|
92
|
+
for (let k = best; k >= 0; k = previous[k]) stays.add(kept[k]);
|
|
93
|
+
let anchor = null;
|
|
94
|
+
for (let i = next.length - 1; i >= 0; i--) {
|
|
95
|
+
const row = next[i];
|
|
96
|
+
const at = position.get(row);
|
|
97
|
+
if (at === void 0 || !stays.has(at)) parent.insertBefore(row, anchor);
|
|
98
|
+
anchor = row;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function Swimlanes(props) {
|
|
102
|
+
const merged = mergeProps(
|
|
103
|
+
{
|
|
104
|
+
selectable: true,
|
|
105
|
+
rowHeight: SWIMLANES_DEFAULT_ROW_HEIGHT,
|
|
106
|
+
overscan: SWIMLANES_DEFAULT_OVERSCAN
|
|
107
|
+
},
|
|
108
|
+
props
|
|
109
|
+
);
|
|
110
|
+
const [local, rest] = splitProps(merged, [
|
|
111
|
+
"class",
|
|
112
|
+
"style",
|
|
113
|
+
"lanes",
|
|
114
|
+
"label",
|
|
115
|
+
"selectedId",
|
|
116
|
+
"defaultSelectedId",
|
|
117
|
+
"onSelectedChange",
|
|
118
|
+
"selectable",
|
|
119
|
+
"rowHeight",
|
|
120
|
+
"headerWidth",
|
|
121
|
+
"contentMinWidth",
|
|
122
|
+
"height",
|
|
123
|
+
"overscan",
|
|
124
|
+
"emptyLabel",
|
|
125
|
+
"ref",
|
|
126
|
+
"data-testid",
|
|
127
|
+
"onScroll",
|
|
128
|
+
"onKeyDown",
|
|
129
|
+
"onClick",
|
|
130
|
+
"onFocusIn"
|
|
131
|
+
]);
|
|
132
|
+
let root;
|
|
133
|
+
let sizer;
|
|
134
|
+
const rows = /* @__PURE__ */ new Map();
|
|
135
|
+
const rowHeight = () => local.rowHeight;
|
|
136
|
+
const [measured, setMeasured] = createSignal(0);
|
|
137
|
+
const viewportHeight = () => measured() || (typeof local.height === "number" ? local.height : SWIMLANES_DEFAULT_HEIGHT);
|
|
138
|
+
const laneList = createMemo(() => local.lanes);
|
|
139
|
+
const virtual = createVirtualList({
|
|
140
|
+
itemCount: () => laneList().length,
|
|
141
|
+
itemHeight: rowHeight,
|
|
142
|
+
viewportHeight,
|
|
143
|
+
overscan: local.overscan
|
|
144
|
+
});
|
|
145
|
+
const indexById = createMemo(() => {
|
|
146
|
+
const map = /* @__PURE__ */ new Map();
|
|
147
|
+
laneList().forEach((lane, index) => {
|
|
148
|
+
if (!map.has(lane.id)) map.set(lane.id, index);
|
|
149
|
+
});
|
|
150
|
+
return map;
|
|
151
|
+
});
|
|
152
|
+
const laneIds = createMemo(() => laneList().map((lane) => lane.id));
|
|
153
|
+
const laneById = createMemo(() => {
|
|
154
|
+
const map = /* @__PURE__ */ new Map();
|
|
155
|
+
for (const lane of laneList()) if (!map.has(lane.id)) map.set(lane.id, lane);
|
|
156
|
+
return map;
|
|
157
|
+
});
|
|
158
|
+
const isEmpty = () => laneList().length === 0;
|
|
159
|
+
const [chosen, setSelected] = createControllableState({
|
|
160
|
+
value: () => local.selectedId,
|
|
161
|
+
defaultValue: untrack(() => local.defaultSelectedId) ?? null,
|
|
162
|
+
onChange: (id) => local.onSelectedChange?.(id)
|
|
163
|
+
});
|
|
164
|
+
const selected = () => local.selectable ? chosen() : null;
|
|
165
|
+
const isSelected = createSelector(selected);
|
|
166
|
+
const choose = (laneId) => {
|
|
167
|
+
if (!local.selectable || selected() === laneId) return;
|
|
168
|
+
const index = indexById().get(laneId);
|
|
169
|
+
if (index === void 0 || laneList()[index]?.disabled) return;
|
|
170
|
+
setSelected(laneId);
|
|
171
|
+
};
|
|
172
|
+
const [activeCell, setActiveCell] = createSignal(null);
|
|
173
|
+
const tabStop = createMemo(() => {
|
|
174
|
+
const indexes = indexById();
|
|
175
|
+
const last = activeCell();
|
|
176
|
+
if (last !== null && indexes.has(last.laneId)) return last;
|
|
177
|
+
const chosen2 = selected();
|
|
178
|
+
if (chosen2 !== null && indexes.has(chosen2)) return { laneId: chosen2, col: 0 };
|
|
179
|
+
const first = laneList()[0];
|
|
180
|
+
return first === void 0 ? null : { laneId: first.id, col: 0 };
|
|
181
|
+
});
|
|
182
|
+
const renderedIds = createMemo(
|
|
183
|
+
() => {
|
|
184
|
+
const ids = laneIds();
|
|
185
|
+
const indexes = /* @__PURE__ */ new Set();
|
|
186
|
+
for (let index = virtual.startIndex(); index < virtual.endIndex(); index++) {
|
|
187
|
+
if (index >= 0 && index < ids.length) indexes.add(index);
|
|
188
|
+
}
|
|
189
|
+
const stop = tabStop();
|
|
190
|
+
const stopIndex = stop === null ? void 0 : indexById().get(stop.laneId);
|
|
191
|
+
if (stopIndex !== void 0) indexes.add(stopIndex);
|
|
192
|
+
const first = indexById();
|
|
193
|
+
return [...indexes].sort((a, b) => a - b).filter((index) => first.get(ids[index]) === index).map((index) => ids[index]);
|
|
194
|
+
},
|
|
195
|
+
[],
|
|
196
|
+
{ equals: (a, b) => a.length === b.length && a.every((id, i) => id === b[i]) }
|
|
197
|
+
);
|
|
198
|
+
const cellOf = (laneId, col) => {
|
|
199
|
+
const cell = rows.get(laneId)?.children[col];
|
|
200
|
+
return cell instanceof HTMLElement ? cell : null;
|
|
201
|
+
};
|
|
202
|
+
const cellInfo = (element) => {
|
|
203
|
+
if (element === null) return null;
|
|
204
|
+
const header = element.classList.contains("smwb-swimlanes__header");
|
|
205
|
+
if (!header && !element.classList.contains("smwb-swimlanes__content")) return null;
|
|
206
|
+
const row = element.parentElement;
|
|
207
|
+
if (row === null || row.parentElement !== sizer) return null;
|
|
208
|
+
const laneId = row.dataset["laneId"];
|
|
209
|
+
return laneId === void 0 ? null : { laneId, col: header ? 0 : 1 };
|
|
210
|
+
};
|
|
211
|
+
const scrollRowIntoView = (index) => {
|
|
212
|
+
const scroller = root;
|
|
213
|
+
if (!scroller) return;
|
|
214
|
+
const top = index * rowHeight();
|
|
215
|
+
const height = scroller.clientHeight || viewportHeight();
|
|
216
|
+
const current = scroller.scrollTop;
|
|
217
|
+
const next = top < current ? top : top + rowHeight() > current + height ? top + rowHeight() - height : current;
|
|
218
|
+
if (next === current) return;
|
|
219
|
+
scroller.scrollTop = next;
|
|
220
|
+
virtual.onScroll({ currentTarget: { scrollTop: next } });
|
|
221
|
+
};
|
|
222
|
+
const moveFocus = (target) => {
|
|
223
|
+
const lane = laneList()[target.index];
|
|
224
|
+
if (!lane) return;
|
|
225
|
+
batch(() => {
|
|
226
|
+
scrollRowIntoView(target.index);
|
|
227
|
+
setActiveCell({ laneId: lane.id, col: target.col });
|
|
228
|
+
});
|
|
229
|
+
cellOf(lane.id, target.col)?.focus({ preventScroll: true });
|
|
230
|
+
};
|
|
231
|
+
const pageSize = () => Math.max(1, Math.floor((root?.clientHeight || viewportHeight()) / rowHeight()) - 1);
|
|
232
|
+
const handleKey = (event) => {
|
|
233
|
+
const cell = cellInfo(event.target instanceof Element ? event.target : null);
|
|
234
|
+
if (cell === null) return;
|
|
235
|
+
const index = indexById().get(cell.laneId);
|
|
236
|
+
if (index === void 0) return;
|
|
237
|
+
const key = event.key;
|
|
238
|
+
if (!event.ctrlKey && !event.metaKey && !event.altKey) {
|
|
239
|
+
if (key === "Enter" || key === " ") {
|
|
240
|
+
event.preventDefault();
|
|
241
|
+
choose(cell.laneId);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (key === "Escape") {
|
|
245
|
+
if (selected() === null) return;
|
|
246
|
+
event.preventDefault();
|
|
247
|
+
setSelected(null);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const target = swimlanesKeyTarget(
|
|
252
|
+
key,
|
|
253
|
+
event,
|
|
254
|
+
{ index, col: cell.col },
|
|
255
|
+
{ count: laneList().length, pageSize: pageSize() }
|
|
256
|
+
);
|
|
257
|
+
if (target === null) return;
|
|
258
|
+
event.preventDefault();
|
|
259
|
+
moveFocus(target);
|
|
260
|
+
};
|
|
261
|
+
const handleClick = (event) => {
|
|
262
|
+
const target = event.target;
|
|
263
|
+
if (!(target instanceof Element)) return;
|
|
264
|
+
const element = target.closest(CELLS);
|
|
265
|
+
const cell = cellInfo(element);
|
|
266
|
+
if (cell === null || element === null) return;
|
|
267
|
+
if (!isOwnClick(event, element)) return;
|
|
268
|
+
setActiveCell(cell);
|
|
269
|
+
choose(cell.laneId);
|
|
270
|
+
};
|
|
271
|
+
const handleFocusIn = (event) => {
|
|
272
|
+
for (let element = event.target instanceof Element ? event.target.closest(CELLS) : null; element !== null; element = element.parentElement?.closest(CELLS) ?? null) {
|
|
273
|
+
const cell = cellInfo(element);
|
|
274
|
+
if (cell === null) continue;
|
|
275
|
+
setActiveCell(cell);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const ownTabIndex = /* @__PURE__ */ new WeakMap();
|
|
280
|
+
const writtenTabIndex = /* @__PURE__ */ new WeakMap();
|
|
281
|
+
const syncLane = (laneId, row) => {
|
|
282
|
+
const keep = laneId === untrack(tabStop)?.laneId;
|
|
283
|
+
for (const cell of Array.from(row.children)) {
|
|
284
|
+
for (const inner of cell.querySelectorAll(INNER_FOCUSABLE)) {
|
|
285
|
+
if (!ownTabIndex.has(inner)) ownTabIndex.set(inner, inner.getAttribute("tabindex"));
|
|
286
|
+
const next = keep ? ownTabIndex.get(inner) ?? null : "-1";
|
|
287
|
+
if (inner.getAttribute("tabindex") === next) continue;
|
|
288
|
+
if (next === null) inner.removeAttribute("tabindex");
|
|
289
|
+
else inner.setAttribute("tabindex", next);
|
|
290
|
+
writtenTabIndex.set(inner, next);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
const syncInnerTabStops = () => {
|
|
295
|
+
for (const [laneId, row] of rows) syncLane(laneId, row);
|
|
296
|
+
};
|
|
297
|
+
onMount(() => {
|
|
298
|
+
if (isServer) return;
|
|
299
|
+
createEffect(on(tabStop, syncInnerTabStops));
|
|
300
|
+
if (typeof ResizeObserver === "function") {
|
|
301
|
+
const resize = new ResizeObserver(() => setMeasured(root.clientHeight));
|
|
302
|
+
resize.observe(root);
|
|
303
|
+
onCleanup(() => resize.disconnect());
|
|
304
|
+
}
|
|
305
|
+
if (typeof MutationObserver !== "function") return;
|
|
306
|
+
const observer = new MutationObserver((records) => {
|
|
307
|
+
let sync = false;
|
|
308
|
+
for (const record of records) {
|
|
309
|
+
if (record.type !== "attributes") {
|
|
310
|
+
sync = true;
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const target = record.target;
|
|
314
|
+
if (target.classList.contains("smwb-swimlanes__header") || target.classList.contains("smwb-swimlanes__content"))
|
|
315
|
+
continue;
|
|
316
|
+
const now = target.getAttribute("tabindex");
|
|
317
|
+
if (writtenTabIndex.has(target) && writtenTabIndex.get(target) === now) continue;
|
|
318
|
+
ownTabIndex.set(target, now);
|
|
319
|
+
sync = true;
|
|
320
|
+
}
|
|
321
|
+
if (sync) syncInnerTabStops();
|
|
322
|
+
});
|
|
323
|
+
observer.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: ["tabindex"] });
|
|
324
|
+
onCleanup(() => observer.disconnect());
|
|
325
|
+
});
|
|
326
|
+
createEffect((before) => {
|
|
327
|
+
const now = laneIds();
|
|
328
|
+
if (before !== void 0) {
|
|
329
|
+
untrack(() => {
|
|
330
|
+
const present = new Set(now);
|
|
331
|
+
const chosen2 = selected();
|
|
332
|
+
if (chosen2 !== null && !present.has(chosen2) && before.includes(chosen2)) setSelected(null);
|
|
333
|
+
const stop = activeCell();
|
|
334
|
+
if (stop === null || present.has(stop.laneId)) return;
|
|
335
|
+
setActiveCell(null);
|
|
336
|
+
const next = tabStop();
|
|
337
|
+
const doc = root?.ownerDocument;
|
|
338
|
+
if (next !== null && doc && (doc.activeElement === null || doc.activeElement === doc.body))
|
|
339
|
+
cellOf(next.laneId, next.col)?.focus({ preventScroll: true });
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return now;
|
|
343
|
+
});
|
|
344
|
+
const renderRow = (laneId) => {
|
|
345
|
+
const lane = createMemo((last) => laneById().get(laneId) ?? last);
|
|
346
|
+
const headerSlot = createMemo(() => lane()?.header);
|
|
347
|
+
const contentSlot = createMemo(() => lane()?.content);
|
|
348
|
+
const index = () => indexById().get(laneId) ?? 0;
|
|
349
|
+
const isStop = (col) => {
|
|
350
|
+
const stop = tabStop();
|
|
351
|
+
return stop !== null && stop.laneId === laneId && stop.col === col;
|
|
352
|
+
};
|
|
353
|
+
const header = createMemo(() => {
|
|
354
|
+
const slot = headerSlot();
|
|
355
|
+
return slot === void 0 ? void 0 : untrack(slot);
|
|
356
|
+
});
|
|
357
|
+
const content = createMemo(() => {
|
|
358
|
+
const slot = contentSlot();
|
|
359
|
+
return slot === void 0 ? void 0 : untrack(slot);
|
|
360
|
+
});
|
|
361
|
+
return <div
|
|
362
|
+
class={cn("smwb-swimlanes__row", {
|
|
363
|
+
"smwb-swimlanes__row_selected": isSelected(laneId),
|
|
364
|
+
"smwb-swimlanes__row_disabled": lane()?.disabled
|
|
365
|
+
})}
|
|
366
|
+
role="row"
|
|
367
|
+
aria-rowindex={index() + 1}
|
|
368
|
+
aria-selected={local.selectable ? isSelected(laneId) ? "true" : "false" : void 0}
|
|
369
|
+
aria-disabled={lane()?.disabled ? "true" : void 0}
|
|
370
|
+
data-lane-id={laneId}
|
|
371
|
+
style={{ top: `${index() * rowHeight()}px` }}
|
|
372
|
+
ref={(element) => {
|
|
373
|
+
rows.set(laneId, element);
|
|
374
|
+
onMount(() => syncLane(laneId, element));
|
|
375
|
+
onCleanup(() => {
|
|
376
|
+
if (rows.get(laneId) === element) rows.delete(laneId);
|
|
377
|
+
});
|
|
378
|
+
}}
|
|
379
|
+
>
|
|
380
|
+
<div class="smwb-swimlanes__header" role="rowheader" tabIndex={isStop(0) ? 0 : -1}>
|
|
381
|
+
{header()}
|
|
382
|
+
</div>
|
|
383
|
+
<div class="smwb-swimlanes__content" role="gridcell" tabIndex={isStop(1) ? 0 : -1}>
|
|
384
|
+
{content()}
|
|
385
|
+
</div>
|
|
386
|
+
</div>;
|
|
387
|
+
};
|
|
388
|
+
const rowNodes = createMemo(mapArray(renderedIds, renderRow));
|
|
389
|
+
const rootStyle = () => {
|
|
390
|
+
const own = { "--smwb-swimlanes-row-height": `${rowHeight()}px` };
|
|
391
|
+
if (local.height !== void 0) own.height = cssLength(local.height);
|
|
392
|
+
if (local.headerWidth !== void 0) own["--smwb-swimlanes-header-width"] = cssLength(local.headerWidth);
|
|
393
|
+
if (local.contentMinWidth !== void 0)
|
|
394
|
+
own["--smwb-swimlanes-content-min-width"] = cssLength(local.contentMinWidth);
|
|
395
|
+
return mergeStyle(own, local.style);
|
|
396
|
+
};
|
|
397
|
+
return <div
|
|
398
|
+
data-testid={local["data-testid"] ?? "swimlanes"}
|
|
399
|
+
{...rest}
|
|
400
|
+
ref={mergeRefs(local.ref, (element) => root = element)}
|
|
401
|
+
class={cn("smwb-swimlanes", { "smwb-swimlanes_empty": isEmpty() }, local.class)}
|
|
402
|
+
style={rootStyle()}
|
|
403
|
+
role={isEmpty() ? void 0 : "grid"}
|
|
404
|
+
aria-label={isEmpty() ? void 0 : local.label}
|
|
405
|
+
aria-rowcount={isEmpty() ? void 0 : laneList().length}
|
|
406
|
+
aria-colcount={isEmpty() ? void 0 : 2}
|
|
407
|
+
onScroll={(event) => {
|
|
408
|
+
callHandler(local.onScroll, event);
|
|
409
|
+
virtual.onScroll({ currentTarget: { scrollTop: event.currentTarget.scrollTop } });
|
|
410
|
+
}}
|
|
411
|
+
onKeyDown={(event) => {
|
|
412
|
+
callHandler(local.onKeyDown, event);
|
|
413
|
+
handleKey(event);
|
|
414
|
+
}}
|
|
415
|
+
onClick={(event) => {
|
|
416
|
+
callHandler(local.onClick, event);
|
|
417
|
+
handleClick(event);
|
|
418
|
+
}}
|
|
419
|
+
onFocusIn={(event) => {
|
|
420
|
+
callHandler(local.onFocusIn, event);
|
|
421
|
+
handleFocusIn(event);
|
|
422
|
+
}}
|
|
423
|
+
>
|
|
424
|
+
<Show when={!isEmpty()} fallback={<div class="smwb-swimlanes__empty">{local.emptyLabel}</div>}>
|
|
425
|
+
{isServer ? <div class="smwb-swimlanes__sizer" role="presentation" style={{ height: `${virtual.totalHeight()}px` }}>
|
|
426
|
+
{rowNodes()}
|
|
427
|
+
</div> : <div
|
|
428
|
+
class="smwb-swimlanes__sizer"
|
|
429
|
+
role="presentation"
|
|
430
|
+
ref={(element) => {
|
|
431
|
+
sizer = element;
|
|
432
|
+
createRenderEffect(() => placeRows(element, rowNodes()));
|
|
433
|
+
onCleanup(() => {
|
|
434
|
+
if (sizer === element) sizer = void 0;
|
|
435
|
+
});
|
|
436
|
+
}}
|
|
437
|
+
style={{ height: `${virtual.totalHeight()}px` }}
|
|
438
|
+
/>}
|
|
439
|
+
</Show>
|
|
440
|
+
</div>;
|
|
441
|
+
}
|
|
442
|
+
var swimlanes_default = Swimlanes;
|
|
443
|
+
export {
|
|
444
|
+
SWIMLANES_DEFAULT_HEIGHT,
|
|
445
|
+
SWIMLANES_DEFAULT_OVERSCAN,
|
|
446
|
+
SWIMLANES_DEFAULT_ROW_HEIGHT,
|
|
447
|
+
Swimlanes,
|
|
448
|
+
swimlanes_default as default
|
|
449
|
+
};
|
|
450
|
+
//# sourceMappingURL=swimlanes.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/components/dataDisplay/swimlanes/swimlanes.tsx"],"sourcesContent":["import {\n type JSX,\n Show,\n batch,\n createEffect,\n createMemo,\n createRenderEffect,\n createSelector,\n createSignal,\n mapArray,\n mergeProps,\n on,\n onCleanup,\n onMount,\n splitProps,\n untrack,\n} from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport cn from \"clsx\";\nimport { callHandler } from \"../../../primitives/callHandler\";\nimport { createControllableState } from \"../../../primitives/createControllableState\";\nimport { createVirtualList } from \"../../../primitives/createVirtualList\";\nimport { mergeRefs, type Ref } from \"../../../primitives/mergeRefs\";\nimport { mergeStyle } from \"../../../primitives/mergeStyle\";\nimport { isOwnClick } from \"../../../utils/ownClick\";\n\n/** Every lane is this tall; the window maths needs a fixed height. */\nexport const SWIMLANES_DEFAULT_ROW_HEIGHT = 64;\n/** The grid's height in pixels when neither the prop nor the caller's CSS sets one. */\nexport const SWIMLANES_DEFAULT_HEIGHT = 480;\n/** Lanes rendered above and below the visible ones. */\nexport const SWIMLANES_DEFAULT_OVERSCAN = 4;\n\nexport interface SwimlanesLane {\n /** Stable, unique id: keys the row, the selection and the Tab stop. */\n id: string;\n /**\n * The lane's header (avatar, name, role); drawn in the fixed left column,\n * `role=\"rowheader\"`. Called when the row mounts, and again on each remount,\n * so the rows that scrolling brings back are built then and not up front;\n * called again, too, when a refreshed lane brings a new function.\n */\n header: () => JSX.Element;\n /**\n * The lane's content (current item, progress, last signal, budget);\n * `role=\"gridcell\"`. Called when the row mounts, and again on each remount.\n * A refreshed lane that brings a new function rebuilds the content, and focus\n * on a control inside it goes to the page: keep the function stable per id.\n */\n content: () => JSX.Element;\n /** A disabled lane can be focused but not selected (`aria-disabled`). */\n disabled?: boolean | undefined;\n}\n\nexport interface SwimlanesProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, \"onSelect\" | \"role\" | \"children\"> {\n /** The lanes, one row each, in the order they are shown. */\n lanes: readonly SwimlanesLane[];\n /** Accessible name of the grid (`aria-label`); `aria-labelledby` wins when given. */\n label?: string | undefined;\n /** The selected lane's id (controlled); `null` selects nothing. */\n selectedId?: string | null | undefined;\n /** The lane selected at first (uncontrolled). */\n defaultSelectedId?: string | null | undefined;\n /** A lane was selected (its id) or the selection was cleared (`null`). */\n onSelectedChange?: ((id: string | null) => void) | undefined;\n /**\n * Whether lanes can be selected; true by default. False: no `aria-selected`, no selected look,\n * and Enter, Space, Escape and a click select nothing; a `selectedId` given anyway is ignored.\n */\n selectable?: boolean | undefined;\n /** Row height in px (every lane is this tall; virtualisation needs a fixed height). 64 by default. */\n rowHeight?: number | undefined;\n /** Width of the fixed header column: px or any CSS length; 240px by default from the stylesheet. */\n headerWidth?: number | string | undefined;\n /** Narrowest width of the content column; when the grid is narrower, it scrolls sideways. 0 by default. */\n contentMinWidth?: number | string | undefined;\n /**\n * Height of the grid (the scroller): a number of pixels or any CSS length;\n * 480 by default, from the stylesheet, so a height in `style` works too.\n */\n height?: number | string | undefined;\n /** Lanes rendered above and below the visible ones. 4 by default. Read once, when the grid mounts. */\n overscan?: number | undefined;\n /** Shown instead of the grid when `lanes` is empty. */\n emptyLabel?: JSX.Element;\n /** Test id of the root `<div>`; `swimlanes` unless given. */\n \"data-testid\"?: string | undefined;\n ref?: Ref<HTMLDivElement>;\n}\n\n/** The cell that is the grid's one Tab stop: its lane and its column. */\ninterface ActiveCell {\n readonly laneId: string;\n readonly col: 0 | 1;\n}\n\n/** Where the focus is, or is about to go: a lane's index and column. */\ninterface SwimlanesPosition {\n index: number;\n /** 0 is the rowheader, 1 the gridcell. */\n col: 0 | 1;\n}\n\n/** What can take focus inside a lane's own content. */\nconst INNER_FOCUSABLE =\n 'a[href], button, input, select, textarea, iframe, summary, audio[controls], video[controls], [tabindex], [contenteditable]:not([contenteditable=\"false\"])';\n\nconst CELLS = \".smwb-swimlanes__header, .smwb-swimlanes__content\";\n\nconst cssLength = (value: number | string): string => (typeof value === \"number\" ? `${value}px` : value);\n\n/**\n * Where a key moves the focus, or null when the grid leaves the key alone.\n *\n * The arrows walk the lanes and the columns without wrapping, so at an edge\n * there is nothing to do and the key is not prevented; Home and End stay in the\n * row and Ctrl+Home and Ctrl+End go to the first and last lane (the APG grid\n * model); the page keys move by the rows that fit, less one so a row of context\n * stays on screen. Any other key, and any combination with Ctrl, Cmd or Alt\n * apart from those two, belongs to the browser or to the lane's own content.\n */\nfunction swimlanesKeyTarget(\n key: string,\n mods: { ctrlKey: boolean; metaKey: boolean; altKey: boolean },\n from: SwimlanesPosition,\n context: { count: number; pageSize: number }\n): SwimlanesPosition | null {\n const last = context.count - 1;\n if (last < 0) return null;\n const clamp = (index: number): number => Math.min(last, Math.max(0, index));\n // Nothing to do when the move lands where the focus already is.\n const lane = (index: number): SwimlanesPosition | null => (index === from.index ? null : { index, col: from.col });\n const column = (col: 0 | 1): SwimlanesPosition | null => (col === from.col ? null : { index: from.index, col });\n\n if (mods.ctrlKey || mods.metaKey || mods.altKey) {\n // Ctrl+Home and Ctrl+End are the grid's; the rest are the browser's.\n if (!mods.ctrlKey || mods.metaKey || mods.altKey) return null;\n if (key === \"Home\") return lane(0);\n if (key === \"End\") return lane(last);\n return null;\n }\n\n switch (key) {\n case \"ArrowDown\":\n return lane(clamp(from.index + 1));\n case \"ArrowUp\":\n return lane(clamp(from.index - 1));\n case \"ArrowRight\":\n return column(1);\n case \"ArrowLeft\":\n return column(0);\n case \"Home\":\n return column(0);\n case \"End\":\n return column(1);\n case \"PageDown\":\n return lane(clamp(from.index + context.pageSize));\n case \"PageUp\":\n return lane(clamp(from.index - context.pageSize));\n default:\n return null;\n }\n}\n\n/**\n * Puts the rows into the sizer in the given order, moving no row that can stay.\n *\n * Solid's list diff may take a kept node out and put it back (a pinned lane\n * that the window reaches again is one), and a browser treats that as a\n * removal: focus inside the row blurs to nowhere, a focused field fires\n * `change`, inner scroll offsets reset. React moves no row there. So the rows\n * already in the right order among themselves stay where they are (the longest\n * such run, and always the row that holds focus), and only the others are\n * inserted, or on a reorder moved, around them. A scroll keeps the order of the\n * rows it keeps, so it moves none.\n */\nfunction placeRows(parent: HTMLElement, next: readonly HTMLElement[]): void {\n const wanted = new Set<Element>(next);\n for (const child of Array.from(parent.children)) if (!wanted.has(child)) child.remove();\n const position = new Map<Element, number>();\n Array.from(parent.children).forEach((child, at) => position.set(child, at));\n\n const active = parent.ownerDocument.activeElement;\n const focused = active === null ? -1 : next.findIndex((row) => row.contains(active));\n const focusedAt = focused < 0 ? undefined : position.get(next[focused]!);\n // The rows already in the sizer, in their new order; with a focused row, only\n // those that can stay on the same side of it as before.\n const kept: number[] = [];\n next.forEach((row, i) => {\n const at = position.get(row);\n if (at === undefined) return;\n if (focusedAt !== undefined && i !== focused && i < focused !== at < focusedAt) return;\n kept.push(at);\n });\n // The longest run of them in ascending place stays put (a few dozen rows, so quadratic is fine).\n const length = kept.map(() => 1);\n const previous = kept.map(() => -1);\n let best = -1;\n kept.forEach((at, k) => {\n for (let j = 0; j < k; j++) {\n if (kept[j]! < at && length[j]! + 1 > length[k]!) {\n length[k] = length[j]! + 1;\n previous[k] = j;\n }\n }\n if (best < 0 || length[k]! > length[best]!) best = k;\n });\n const stays = new Set<number>();\n for (let k = best; k >= 0; k = previous[k]!) stays.add(kept[k]!);\n\n let anchor: HTMLElement | null = null;\n for (let i = next.length - 1; i >= 0; i--) {\n const row = next[i]!;\n const at = position.get(row);\n if (at === undefined || !stays.has(at)) parent.insertBefore(row, anchor);\n anchor = row;\n }\n}\n\n/**\n * Participant lanes: one row per participant, with the header (avatar, name,\n * role) in a column that stays put while the content beside it (the current\n * item, progress, the last signal, the budget) scrolls sideways under it. The\n * rows are virtualised, so 200 lanes cost a window of about twenty rows, and\n * the lane that holds the Tab stop is always among them, so focus survives\n * scrolling. Lanes are selected by a click or the keyboard, under the library's\n * controlled-state rule; the grid is one Tab stop, and a lane's own links and\n * buttons are reachable from it.\n */\nexport function Swimlanes(props: SwimlanesProps): JSX.Element {\n const merged = mergeProps(\n {\n selectable: true,\n rowHeight: SWIMLANES_DEFAULT_ROW_HEIGHT,\n overscan: SWIMLANES_DEFAULT_OVERSCAN,\n },\n props\n );\n const [local, rest] = splitProps(merged, [\n \"class\",\n \"style\",\n \"lanes\",\n \"label\",\n \"selectedId\",\n \"defaultSelectedId\",\n \"onSelectedChange\",\n \"selectable\",\n \"rowHeight\",\n \"headerWidth\",\n \"contentMinWidth\",\n \"height\",\n \"overscan\",\n \"emptyLabel\",\n \"ref\",\n \"data-testid\",\n \"onScroll\",\n \"onKeyDown\",\n \"onClick\",\n \"onFocusIn\",\n ]);\n\n let root!: HTMLDivElement;\n let sizer: HTMLDivElement | undefined;\n /** The mounted rows by lane id: the roving Tab stop and the inner-focusable sync need them. */\n const rows = new Map<string, HTMLElement>();\n\n const rowHeight = (): number => local.rowHeight;\n const [measured, setMeasured] = createSignal(0);\n // Until it can measure (on the server and at the first paint) the window comes\n // from the height prop, so the server's HTML and the first client render agree.\n // A measured 0 (jsdom, a hidden parent) keeps that estimate.\n const viewportHeight = (): number =>\n measured() || (typeof local.height === \"number\" ? local.height : SWIMLANES_DEFAULT_HEIGHT);\n\n // The lanes as one snapshot. A caller's `lanes={make(200)}` reaches the\n // component as a getter that allocates on every read, so without this the\n // rows below would be remade — losing focus and calling the slots again — on\n // every move of the window or the Tab stop.\n const laneList = createMemo((): readonly SwimlanesLane[] => local.lanes);\n\n const virtual = createVirtualList({\n itemCount: () => laneList().length,\n itemHeight: rowHeight,\n viewportHeight,\n overscan: local.overscan,\n });\n\n const indexById = createMemo(() => {\n const map = new Map<string, number>();\n laneList().forEach((lane, index) => {\n if (!map.has(lane.id)) map.set(lane.id, index);\n });\n return map;\n });\n const laneIds = createMemo((): readonly string[] => laneList().map((lane) => lane.id));\n const laneById = createMemo(() => {\n const map = new Map<string, SwimlanesLane>();\n for (const lane of laneList()) if (!map.has(lane.id)) map.set(lane.id, lane);\n return map;\n });\n const isEmpty = (): boolean => laneList().length === 0;\n\n // ---- Selection ----\n\n const [chosen, setSelected] = createControllableState<string | null>({\n value: () => local.selectedId,\n defaultValue: untrack(() => local.defaultSelectedId) ?? null,\n onChange: (id) => local.onSelectedChange?.(id),\n });\n // `selectable={false}` turns the selection off: a `selectedId` given anyway\n // paints nothing, is not the Tab stop, and Escape has nothing to clear.\n const selected = (): string | null => (local.selectable ? chosen() : null);\n const isSelected = createSelector(selected);\n\n /** Selects a lane: the selected one keeps it and calls nothing, and a disabled one is never selected. */\n const choose = (laneId: string): void => {\n if (!local.selectable || selected() === laneId) return;\n const index = indexById().get(laneId);\n if (index === undefined || laneList()[index]?.disabled) return;\n setSelected(laneId);\n };\n\n // ---- Focus: one Tab stop, on the last focused cell, else the selected lane, else the first ----\n\n const [activeCell, setActiveCell] = createSignal<ActiveCell | null>(null);\n const tabStop = createMemo((): ActiveCell | null => {\n const indexes = indexById();\n const last = activeCell();\n if (last !== null && indexes.has(last.laneId)) return last;\n const chosen = selected();\n if (chosen !== null && indexes.has(chosen)) return { laneId: chosen, col: 0 };\n const first = laneList()[0];\n return first === undefined ? null : { laneId: first.id, col: 0 };\n });\n\n // The ids of the window, plus the Tab-stop lane when it lies outside it: the\n // cell that holds or will receive focus always exists in the DOM, so a lane\n // focused and then scrolled away with the wheel stays mounted, and keeps\n // focus, at its own place. Ascending index order, as the rows are read by\n // assistive technology. Rows are keyed by id, as in React, so a lanes array\n // rebuilt with the same ids keeps its rows, and an unchanged list is no\n // update at all.\n const renderedIds = createMemo(\n (): readonly string[] => {\n const ids = laneIds();\n const indexes = new Set<number>();\n for (let index = virtual.startIndex(); index < virtual.endIndex(); index++) {\n if (index >= 0 && index < ids.length) indexes.add(index);\n }\n const stop = tabStop();\n const stopIndex = stop === null ? undefined : indexById().get(stop.laneId);\n if (stopIndex !== undefined) indexes.add(stopIndex);\n // Ids are unique; a repeated one is drawn once, at its first place.\n const first = indexById();\n return [...indexes]\n .sort((a, b) => a - b)\n .filter((index) => first.get(ids[index]!) === index)\n .map((index) => ids[index]!);\n },\n [],\n { equals: (a, b) => a.length === b.length && a.every((id, i) => id === b[i]) }\n );\n\n /** The cell of a lane, once its row is in the DOM. */\n const cellOf = (laneId: string, col: 0 | 1): HTMLElement | null => {\n const cell = rows.get(laneId)?.children[col];\n return cell instanceof HTMLElement ? cell : null;\n };\n\n /** The lane and column of a cell of this grid, or null when the element is not one. */\n const cellInfo = (element: Element | null): ActiveCell | null => {\n if (element === null) return null;\n const header = element.classList.contains(\"smwb-swimlanes__header\");\n if (!header && !element.classList.contains(\"smwb-swimlanes__content\")) return null;\n // The cell is the row's child and the row the sizer's, so a grid nested in a\n // lane's own content is not this grid's cell.\n const row = element.parentElement;\n if (row === null || row.parentElement !== sizer) return null;\n const laneId = row.dataset[\"laneId\"];\n return laneId === undefined ? null : { laneId, col: header ? 0 : 1 };\n };\n\n /** The least scroll that shows the row at `index`, aligning the nearer edge, as in SelectField's menu. */\n const scrollRowIntoView = (index: number): void => {\n const scroller = root;\n if (!scroller) return;\n const top = index * rowHeight();\n const height = scroller.clientHeight || viewportHeight();\n const current = scroller.scrollTop;\n const next = top < current ? top : top + rowHeight() > current + height ? top + rowHeight() - height : current;\n if (next === current) return;\n // The window has to move with the scroll, in the same update: the row the\n // keyboard asked for is not in the DOM yet otherwise.\n scroller.scrollTop = next;\n virtual.onScroll({ currentTarget: { scrollTop: next } });\n };\n\n /** Moves the Tab stop to a cell, scrolls its row into view, and focuses it once the DOM has it. */\n const moveFocus = (target: SwimlanesPosition): void => {\n const lane = laneList()[target.index];\n if (!lane) return;\n batch(() => {\n scrollRowIntoView(target.index);\n setActiveCell({ laneId: lane.id, col: target.col });\n });\n cellOf(lane.id, target.col)?.focus({ preventScroll: true });\n };\n\n /** The rows that fit, minus one row of context, for the page keys. */\n const pageSize = (): number => Math.max(1, Math.floor((root?.clientHeight || viewportHeight()) / rowHeight()) - 1);\n\n const handleKey = (event: KeyboardEvent): void => {\n // Keys pressed in a lane's own content (a link, a field) are that content's.\n const cell = cellInfo(event.target instanceof Element ? event.target : null);\n if (cell === null) return;\n const index = indexById().get(cell.laneId);\n if (index === undefined) return;\n const key = event.key;\n if (!event.ctrlKey && !event.metaKey && !event.altKey) {\n if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n choose(cell.laneId);\n return;\n }\n if (key === \"Escape\") {\n // Handled only with a selection, so an enclosing dialog still gets the key otherwise.\n if (selected() === null) return;\n event.preventDefault();\n setSelected(null);\n return;\n }\n }\n const target = swimlanesKeyTarget(\n key,\n event,\n { index, col: cell.col },\n { count: laneList().length, pageSize: pageSize() }\n );\n if (target === null) return;\n event.preventDefault();\n moveFocus(target);\n };\n\n const handleClick = (event: MouseEvent): void => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const element = target.closest(CELLS);\n const cell = cellInfo(element);\n if (cell === null || element === null) return;\n // A click on a control inside a lane (a button, a link) is that control's.\n if (!isOwnClick(event, element)) return;\n setActiveCell(cell);\n choose(cell.laneId);\n };\n\n const handleFocusIn = (event: FocusEvent): void => {\n // Focus on a cell, or on a control inside one (a button the pointer focused),\n // moves the Tab stop to that cell: its lane is then kept in the DOM, and its\n // controls get their Tab order back, wherever the window scrolls to.\n for (\n let element = event.target instanceof Element ? event.target.closest(CELLS) : null;\n element !== null;\n element = element.parentElement?.closest(CELLS) ?? null\n ) {\n // A cell of a grid nested in the lane's content is not this grid's: go on up.\n const cell = cellInfo(element);\n if (cell === null) continue;\n setActiveCell(cell);\n return;\n }\n };\n\n // ---- One Tab stop inside the lanes ----\n\n const ownTabIndex = new WeakMap<Element, string | null>();\n // The value the component wrote last, so its own writes can be told apart from\n // the caller's in the attribute records below.\n const writtenTabIndex = new WeakMap<Element, string | null>();\n\n /** Gives one lane's own controls the Tab order back, or takes it from them. */\n const syncLane = (laneId: string, row: HTMLElement): void => {\n const keep = laneId === untrack(tabStop)?.laneId;\n for (const cell of Array.from(row.children)) {\n for (const inner of cell.querySelectorAll(INNER_FOCUSABLE)) {\n if (!ownTabIndex.has(inner)) ownTabIndex.set(inner, inner.getAttribute(\"tabindex\"));\n const next = keep ? (ownTabIndex.get(inner) ?? null) : \"-1\";\n if (inner.getAttribute(\"tabindex\") === next) continue;\n if (next === null) inner.removeAttribute(\"tabindex\");\n else inner.setAttribute(\"tabindex\", next);\n writtenTabIndex.set(inner, next);\n }\n }\n };\n const syncInnerTabStops = (): void => {\n for (const [laneId, row] of rows) syncLane(laneId, row);\n };\n\n onMount(() => {\n if (isServer) return;\n createEffect(on(tabStop, syncInnerTabStops));\n if (typeof ResizeObserver === \"function\") {\n const resize = new ResizeObserver(() => setMeasured(root.clientHeight));\n resize.observe(root);\n onCleanup(() => resize.disconnect());\n }\n if (typeof MutationObserver !== \"function\") return;\n // Content that changes later (a button that shows up with a status) is caught\n // too, and so is a tabindex the caller writes from a signal: that write is\n // taken as the content's own value, then the Tab order is restored over it.\n const observer = new MutationObserver((records) => {\n let sync = false;\n for (const record of records) {\n if (record.type !== \"attributes\") {\n sync = true;\n continue;\n }\n const target = record.target as Element;\n // A cell's own roving tabindex is the component's, not the content's.\n if (target.classList.contains(\"smwb-swimlanes__header\") || target.classList.contains(\"smwb-swimlanes__content\"))\n continue;\n const now = target.getAttribute(\"tabindex\");\n if (writtenTabIndex.has(target) && writtenTabIndex.get(target) === now) continue;\n ownTabIndex.set(target, now);\n sync = true;\n }\n if (sync) syncInnerTabStops();\n });\n observer.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: [\"tabindex\"] });\n onCleanup(() => observer.disconnect());\n });\n\n // A lane that goes away takes its selection with it, and focus moves to the Tab\n // stop rather than dropping to the page. Only a lane that was there counts: a\n // selection given before the lanes load is kept.\n createEffect<readonly string[] | undefined>((before) => {\n const now = laneIds();\n if (before !== undefined) {\n untrack(() => {\n const present = new Set(now);\n const chosen = selected();\n if (chosen !== null && !present.has(chosen) && before.includes(chosen)) setSelected(null);\n const stop = activeCell();\n if (stop === null || present.has(stop.laneId)) return;\n setActiveCell(null);\n const next = tabStop();\n const doc = root?.ownerDocument;\n if (next !== null && doc && (doc.activeElement === null || doc.activeElement === doc.body))\n cellOf(next.laneId, next.col)?.focus({ preventScroll: true });\n });\n }\n return now;\n });\n\n const renderRow = (laneId: string): JSX.Element => {\n // The lane behind the id. A rebuilt `lanes` array brings new lane objects\n // with the same ids: the row, its cells and focus on a cell stay, and a slot\n // is read again only when its lane brings a new one (focus inside the old\n // content then goes with it, as documented). Once the id has left\n // `lanes` the last lane stays until the list drops the row.\n const lane = createMemo<SwimlanesLane | undefined>((last) => laneById().get(laneId) ?? last);\n const headerSlot = createMemo(() => lane()?.header);\n const contentSlot = createMemo(() => lane()?.content);\n // The place follows the caller's array without the row being rebuilt, so a\n // reorder moves the rows instead of remaking them.\n const index = (): number => indexById().get(laneId) ?? 0;\n const isStop = (col: 0 | 1): boolean => {\n const stop = tabStop();\n return stop !== null && stop.laneId === laneId && stop.col === col;\n };\n // The slots are read untracked, where the row is drawn: an eager read would\n // build the subtrees of every lane up front, and a tracked one would build\n // them again whenever a signal the caller's thunk reads changes.\n const header = createMemo(() => {\n const slot = headerSlot();\n return slot === undefined ? undefined : untrack(slot);\n });\n const content = createMemo(() => {\n const slot = contentSlot();\n return slot === undefined ? undefined : untrack(slot);\n });\n return (\n <div\n class={cn(\"smwb-swimlanes__row\", {\n \"smwb-swimlanes__row_selected\": isSelected(laneId),\n \"smwb-swimlanes__row_disabled\": lane()?.disabled,\n })}\n role=\"row\"\n aria-rowindex={index() + 1}\n aria-selected={local.selectable ? (isSelected(laneId) ? \"true\" : \"false\") : undefined}\n aria-disabled={lane()?.disabled ? \"true\" : undefined}\n data-lane-id={laneId}\n style={{ top: `${index() * rowHeight()}px` }}\n ref={(element) => {\n rows.set(laneId, element);\n // A row mounted later, by scrolling, gets the Tab order at once rather\n // than at the observer's next microtask.\n onMount(() => syncLane(laneId, element));\n onCleanup(() => {\n if (rows.get(laneId) === element) rows.delete(laneId);\n });\n }}\n >\n <div class=\"smwb-swimlanes__header\" role=\"rowheader\" tabIndex={isStop(0) ? 0 : -1}>\n {header()}\n </div>\n <div class=\"smwb-swimlanes__content\" role=\"gridcell\" tabIndex={isStop(1) ? 0 : -1}>\n {content()}\n </div>\n </div>\n );\n };\n\n // One row per rendered id, made when the id enters and disposed when it\n // leaves; the client places them itself (placeRows), the server prints them.\n const rowNodes = createMemo(mapArray(renderedIds, renderRow));\n\n // The default height is the stylesheet's, so a height in the caller's style or\n // CSS is not overridden. The custom properties are written only when given,\n // and the caller's own style comes last, so it wins over them.\n const rootStyle = (): JSX.CSSProperties | string | undefined => {\n const own: JSX.CSSProperties = { \"--smwb-swimlanes-row-height\": `${rowHeight()}px` };\n if (local.height !== undefined) own.height = cssLength(local.height);\n if (local.headerWidth !== undefined) own[\"--smwb-swimlanes-header-width\"] = cssLength(local.headerWidth);\n if (local.contentMinWidth !== undefined)\n own[\"--smwb-swimlanes-content-min-width\"] = cssLength(local.contentMinWidth);\n return mergeStyle(own, local.style);\n };\n\n return (\n <div\n data-testid={local[\"data-testid\"] ?? \"swimlanes\"}\n {...rest}\n ref={mergeRefs(local.ref, (element) => (root = element))}\n class={cn(\"smwb-swimlanes\", { \"smwb-swimlanes_empty\": isEmpty() }, local.class)}\n style={rootStyle()}\n role={isEmpty() ? undefined : \"grid\"}\n aria-label={isEmpty() ? undefined : local.label}\n aria-rowcount={isEmpty() ? undefined : laneList().length}\n aria-colcount={isEmpty() ? undefined : 2}\n onScroll={(event) => {\n callHandler(local.onScroll, event);\n virtual.onScroll({ currentTarget: { scrollTop: event.currentTarget.scrollTop } });\n }}\n onKeyDown={(event) => {\n callHandler(local.onKeyDown, event);\n handleKey(event);\n }}\n onClick={(event) => {\n callHandler(local.onClick, event);\n handleClick(event);\n }}\n onFocusIn={(event) => {\n callHandler(local.onFocusIn, event);\n handleFocusIn(event);\n }}\n >\n <Show when={!isEmpty()} fallback={<div class=\"smwb-swimlanes__empty\">{local.emptyLabel}</div>}>\n {isServer ? (\n <div class=\"smwb-swimlanes__sizer\" role=\"presentation\" style={{ height: `${virtual.totalHeight()}px` }}>\n {rowNodes()}\n </div>\n ) : (\n <div\n class=\"smwb-swimlanes__sizer\"\n role=\"presentation\"\n ref={(element) => {\n sizer = element;\n // Hydration finds the server's rows already in place, so nothing moves.\n createRenderEffect(() => placeRows(element, rowNodes() as HTMLElement[]));\n onCleanup(() => {\n if (sizer === element) sizer = undefined;\n });\n }}\n style={{ height: `${virtual.totalHeight()}px` }}\n />\n )}\n </Show>\n </div>\n );\n}\n\nexport default Swimlanes;\n"],"mappings":"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","names":["chosen"],"file":"swimlanes.jsx"}
|