@open-mercato/core 0.7.1-develop.7203.1.9396450b78 → 0.8.1-develop.7204.1.83330e271e
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/.turbo/turbo-build.log +1 -1
- package/build.mjs +11 -0
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +23 -0
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
- package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -1
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -2
- package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -1
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/lib/detailHelpers.js +4 -0
- package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +5 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/design_system/backend/design-system/page.meta.js +3 -2
- package/dist/modules/design_system/backend/design-system/page.meta.js.map +2 -2
- package/dist/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
- package/dist/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
- package/dist/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
- package/dist/modules/design_system/gallery/assets/avatar-photo.png +0 -0
- package/dist/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
- package/dist/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-ada.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-avax.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-brand.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-btc.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-dot.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-eth.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-history.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-link.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-more.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-sol.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-star.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
- package/dist/modules/design_system/gallery/assets/crypto-trx.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-wei.png +0 -0
- package/dist/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
- package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js +67 -0
- package/dist/modules/design_system/gallery/assets/cryptocurrency-artwork.js.map +7 -0
- package/dist/modules/design_system/gallery/assets/github-logo.png +0 -0
- package/dist/modules/design_system/gallery/assets/images.d.js +1 -0
- package/dist/modules/design_system/gallery/assets/images.d.js.map +7 -0
- package/dist/modules/design_system/gallery/assets/input-european-union.svg +18 -0
- package/dist/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
- package/dist/modules/design_system/gallery/assets/marketing-artwork.js +83 -0
- package/dist/modules/design_system/gallery/assets/marketing-artwork.js.map +7 -0
- package/dist/modules/design_system/gallery/assets/menu-apex.svg +18 -0
- package/dist/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
- package/dist/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
- package/dist/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
- package/dist/modules/design_system/gallery/assets/select-google.png +0 -0
- package/dist/modules/design_system/gallery/assets/select-poland.png +0 -0
- package/dist/modules/design_system/gallery/assets/selection-artwork.js +5 -0
- package/dist/modules/design_system/gallery/assets/selection-artwork.js.map +7 -0
- package/dist/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
- package/dist/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
- package/dist/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
- package/dist/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
- package/dist/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
- package/dist/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
- package/dist/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
- package/dist/modules/design_system/gallery/assets/style-studio-product.png +0 -0
- package/dist/modules/design_system/gallery/assets/upload-images.js +8 -0
- package/dist/modules/design_system/gallery/assets/upload-images.js.map +7 -0
- package/dist/modules/design_system/gallery/components/BrandStylePreview.js +74 -0
- package/dist/modules/design_system/gallery/components/BrandStylePreview.js.map +7 -0
- package/dist/modules/design_system/gallery/components/CodeSnippet.js +31 -31
- package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +2 -2
- package/dist/modules/design_system/gallery/components/ColorPlayground.js +408 -0
- package/dist/modules/design_system/gallery/components/ColorPlayground.js.map +7 -0
- package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js +166 -0
- package/dist/modules/design_system/gallery/components/ColorStudioCompositions.js.map +7 -0
- package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js +182 -0
- package/dist/modules/design_system/gallery/components/ColorStudioSpecimen.js.map +7 -0
- package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js +80 -0
- package/dist/modules/design_system/gallery/components/CompactEntrySpecimen.js.map +7 -0
- package/dist/modules/design_system/gallery/components/ComponentIndex.js +42 -0
- package/dist/modules/design_system/gallery/components/ComponentIndex.js.map +7 -0
- package/dist/modules/design_system/gallery/components/DesignSystemHome.js +69 -0
- package/dist/modules/design_system/gallery/components/DesignSystemHome.js.map +7 -0
- package/dist/modules/design_system/gallery/components/EntryCard.js +47 -41
- package/dist/modules/design_system/gallery/components/EntryCard.js.map +2 -2
- package/dist/modules/design_system/gallery/components/EntryHeader.js +68 -0
- package/dist/modules/design_system/gallery/components/EntryHeader.js.map +7 -0
- package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js +19 -0
- package/dist/modules/design_system/gallery/components/FamilyEntryPreview.js.map +7 -0
- package/dist/modules/design_system/gallery/components/FoundationGuide.js +46 -0
- package/dist/modules/design_system/gallery/components/FoundationGuide.js.map +7 -0
- package/dist/modules/design_system/gallery/components/GalleryLink.js +21 -0
- package/dist/modules/design_system/gallery/components/GalleryLink.js.map +7 -0
- package/dist/modules/design_system/gallery/components/GalleryNavigation.js +82 -0
- package/dist/modules/design_system/gallery/components/GalleryNavigation.js.map +7 -0
- package/dist/modules/design_system/gallery/components/GalleryShell.js +147 -67
- package/dist/modules/design_system/gallery/components/GalleryShell.js.map +3 -3
- package/dist/modules/design_system/gallery/components/IconsBrowser.js +33 -0
- package/dist/modules/design_system/gallery/components/IconsBrowser.js.map +7 -0
- package/dist/modules/design_system/gallery/components/SourceLibrary.js +93 -0
- package/dist/modules/design_system/gallery/components/SourceLibrary.js.map +7 -0
- package/dist/modules/design_system/gallery/components/StyleAgents.js +139 -0
- package/dist/modules/design_system/gallery/components/StyleAgents.js.map +7 -0
- package/dist/modules/design_system/gallery/components/ThemeTokenReference.js +101 -0
- package/dist/modules/design_system/gallery/components/ThemeTokenReference.js.map +7 -0
- package/dist/modules/design_system/gallery/components/VariantPreview.js +2 -2
- package/dist/modules/design_system/gallery/components/VariantPreview.js.map +2 -2
- package/dist/modules/design_system/gallery/components/colorPreview.js +58 -0
- package/dist/modules/design_system/gallery/components/colorPreview.js.map +7 -0
- package/dist/modules/design_system/gallery/components/colorStudio.js +218 -0
- package/dist/modules/design_system/gallery/components/colorStudio.js.map +7 -0
- package/dist/modules/design_system/gallery/components/styleAgentBranding.js +46 -0
- package/dist/modules/design_system/gallery/components/styleAgentBranding.js.map +7 -0
- package/dist/modules/design_system/gallery/components/themeTokens.js +32 -0
- package/dist/modules/design_system/gallery/components/themeTokens.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js +194 -0
- package/dist/modules/design_system/gallery/demos/ai-product-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/ai-product.js +423 -0
- package/dist/modules/design_system/gallery/demos/ai-product.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/buttons.js +289 -0
- package/dist/modules/design_system/gallery/demos/buttons.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/cryptocurrency.js +1708 -0
- package/dist/modules/design_system/gallery/demos/cryptocurrency.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/feeds-code.generated.js +92 -0
- package/dist/modules/design_system/gallery/demos/feeds-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/feeds.js +148 -0
- package/dist/modules/design_system/gallery/demos/feeds.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/file-upload.js +72 -0
- package/dist/modules/design_system/gallery/demos/file-upload.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/foundation-reference-data.js +4875 -0
- package/dist/modules/design_system/gallery/demos/foundation-reference-data.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/foundation-references.js +188 -0
- package/dist/modules/design_system/gallery/demos/foundation-references.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/key-components-code.generated.js +6 -0
- package/dist/modules/design_system/gallery/demos/key-components-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/key-components.js +127 -0
- package/dist/modules/design_system/gallery/demos/key-components.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js +98 -0
- package/dist/modules/design_system/gallery/demos/marketing-controls-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/marketing-controls.js +134 -0
- package/dist/modules/design_system/gallery/demos/marketing-controls.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js +195 -0
- package/dist/modules/design_system/gallery/demos/marketing-widgets-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/marketing-widgets.js +586 -0
- package/dist/modules/design_system/gallery/demos/marketing-widgets.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/menu-fixtures.js +40 -0
- package/dist/modules/design_system/gallery/demos/menu-fixtures.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/menu-sources.js +295 -0
- package/dist/modules/design_system/gallery/demos/menu-sources.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/menus.js +150 -0
- package/dist/modules/design_system/gallery/demos/menus.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/rating-reviews.js +53 -0
- package/dist/modules/design_system/gallery/demos/rating-reviews.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/registered-icons.js +104 -0
- package/dist/modules/design_system/gallery/demos/registered-icons.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/selection-cards.js +99 -0
- package/dist/modules/design_system/gallery/demos/selection-cards.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/shell-code.generated.js +189 -0
- package/dist/modules/design_system/gallery/demos/shell-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/shell.js +330 -0
- package/dist/modules/design_system/gallery/demos/shell.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/source-artwork.js +120 -0
- package/dist/modules/design_system/gallery/demos/source-artwork.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js +125 -0
- package/dist/modules/design_system/gallery/demos/source-filters-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/source-filters.js +185 -0
- package/dist/modules/design_system/gallery/demos/source-filters.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/source-icons.js +69 -0
- package/dist/modules/design_system/gallery/demos/source-icons.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js +150 -0
- package/dist/modules/design_system/gallery/demos/table-cells-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/table-cells.js +181 -0
- package/dist/modules/design_system/gallery/demos/table-cells.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/text-inputs.js +113 -0
- package/dist/modules/design_system/gallery/demos/text-inputs.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js +41 -0
- package/dist/modules/design_system/gallery/demos/time-picker-code.generated.js.map +7 -0
- package/dist/modules/design_system/gallery/demos/time-picker.js +41 -0
- package/dist/modules/design_system/gallery/demos/time-picker.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/banners.js +123 -60
- package/dist/modules/design_system/gallery/entries/banners.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/buttons-snippets.js +433 -0
- package/dist/modules/design_system/gallery/entries/buttons-snippets.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/buttons.js +127 -148
- package/dist/modules/design_system/gallery/entries/buttons.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/charts.js +532 -186
- package/dist/modules/design_system/gallery/entries/charts.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/dates.js +191 -3
- package/dist/modules/design_system/gallery/entries/dates.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/detail.js +118 -77
- package/dist/modules/design_system/gallery/entries/detail.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/display.js +1449 -240
- package/dist/modules/design_system/gallery/entries/display.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/feedback.js +1058 -132
- package/dist/modules/design_system/gallery/entries/feedback.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/filters.js +231 -103
- package/dist/modules/design_system/gallery/entries/filters.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/foundations.js +368 -57
- package/dist/modules/design_system/gallery/entries/foundations.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/icons.js +29 -91
- package/dist/modules/design_system/gallery/entries/icons.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/inputs-snippets.js +154 -0
- package/dist/modules/design_system/gallery/entries/inputs-snippets.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/inputs.js +2043 -306
- package/dist/modules/design_system/gallery/entries/inputs.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/library.js +20 -0
- package/dist/modules/design_system/gallery/entries/library.js.map +7 -0
- package/dist/modules/design_system/gallery/entries/messages.js +121 -103
- package/dist/modules/design_system/gallery/entries/messages.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/navigation.js +676 -103
- package/dist/modules/design_system/gallery/entries/navigation.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/notifications.js +131 -78
- package/dist/modules/design_system/gallery/entries/notifications.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/overlays.js +611 -203
- package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/scaffolding.js +1175 -120
- package/dist/modules/design_system/gallery/entries/scaffolding.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/schedule.js +79 -54
- package/dist/modules/design_system/gallery/entries/schedule.js.map +2 -2
- package/dist/modules/design_system/gallery/presentation.js +108 -0
- package/dist/modules/design_system/gallery/presentation.js.map +7 -0
- package/dist/modules/design_system/gallery/registry.js +8 -5
- package/dist/modules/design_system/gallery/registry.js.map +2 -2
- package/dist/modules/design_system/gallery/source-library.generated.js +5 -0
- package/dist/modules/design_system/gallery/source-library.generated.js.map +7 -0
- package/dist/modules/design_system/i18n/de.json +7167 -0
- package/dist/modules/design_system/i18n/en.json +7167 -0
- package/dist/modules/design_system/i18n/es.json +7167 -0
- package/dist/modules/design_system/i18n/ko.json +7167 -0
- package/dist/modules/design_system/i18n/pl.json +7167 -0
- package/dist/modules/push_notifications/lib/queue.js +1 -31
- package/dist/modules/push_notifications/lib/queue.js.map +2 -2
- package/jest.config.cjs +1 -0
- package/jest.mocks/image.js +1 -0
- package/package.json +8 -8
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +50 -0
- package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +2 -1
- package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -2
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +2 -1
- package/src/modules/customers/lib/detailHelpers.ts +4 -0
- package/src/modules/customers/lib/todoCompatibility.ts +10 -0
- package/src/modules/design_system/backend/design-system/page.meta.ts +3 -2
- package/src/modules/design_system/gallery/assets/README.md +30 -0
- package/src/modules/design_system/gallery/assets/ai-prompt-image.png +0 -0
- package/src/modules/design_system/gallery/assets/avatar-illustration.png +0 -0
- package/src/modules/design_system/gallery/assets/avatar-memoji.png +0 -0
- package/src/modules/design_system/gallery/assets/avatar-photo.png +0 -0
- package/src/modules/design_system/gallery/assets/blog-photo-0.png +0 -0
- package/src/modules/design_system/gallery/assets/contact-support-portrait.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-ada.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-avax.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-bnb.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-brand.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-btc.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-clock.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-crown.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-dot.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-eth.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-hbar.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-history.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-link.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-menu.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-metamask.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-more.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-phantom.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-rewards.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-sad-face.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-sol.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-star.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-status-cancelled.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-status-pending.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-status-success.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-status-warning.svg +3 -0
- package/src/modules/design_system/gallery/assets/crypto-trx.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-usdc.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-usdt.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-walletconnect.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-wei.png +0 -0
- package/src/modules/design_system/gallery/assets/crypto-xrp.png +0 -0
- package/src/modules/design_system/gallery/assets/cryptocurrency-artwork.ts +63 -0
- package/src/modules/design_system/gallery/assets/github-logo.png +0 -0
- package/src/modules/design_system/gallery/assets/images.d.ts +9 -0
- package/src/modules/design_system/gallery/assets/input-european-union.svg +18 -0
- package/src/modules/design_system/gallery/assets/landing-teams-01.png +0 -0
- package/src/modules/design_system/gallery/assets/marketing-artwork.ts +79 -0
- package/src/modules/design_system/gallery/assets/menu-apex.svg +18 -0
- package/src/modules/design_system/gallery/assets/menu-mastercard.svg +7 -0
- package/src/modules/design_system/gallery/assets/menu-spotify.svg +4 -0
- package/src/modules/design_system/gallery/assets/menu-united-states.svg +16 -0
- package/src/modules/design_system/gallery/assets/select-google.png +0 -0
- package/src/modules/design_system/gallery/assets/select-poland.png +0 -0
- package/src/modules/design_system/gallery/assets/selection-artwork.ts +1 -0
- package/src/modules/design_system/gallery/assets/social-apple-filled.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-apple-stroke.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-dropbox-filled.svg +5 -0
- package/src/modules/design_system/gallery/assets/social-dropbox-stroke.svg +5 -0
- package/src/modules/design_system/gallery/assets/social-facebook-filled.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-facebook-stroke.svg +10 -0
- package/src/modules/design_system/gallery/assets/social-github-filled.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-github-stroke.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-google-filled.svg +7 -0
- package/src/modules/design_system/gallery/assets/social-google-stroke.svg +7 -0
- package/src/modules/design_system/gallery/assets/social-linkedin-filled.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-linkedin-stroke.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-x-filled.svg +4 -0
- package/src/modules/design_system/gallery/assets/social-x-stroke.svg +4 -0
- package/src/modules/design_system/gallery/assets/style-studio-product.png +0 -0
- package/src/modules/design_system/gallery/assets/upload-images.ts +5 -0
- package/src/modules/design_system/gallery/components/BrandStylePreview.tsx +94 -0
- package/src/modules/design_system/gallery/components/CodeSnippet.tsx +34 -34
- package/src/modules/design_system/gallery/components/ColorPlayground.tsx +324 -0
- package/src/modules/design_system/gallery/components/ColorStudioCompositions.tsx +96 -0
- package/src/modules/design_system/gallery/components/ColorStudioSpecimen.tsx +164 -0
- package/src/modules/design_system/gallery/components/CompactEntrySpecimen.tsx +65 -0
- package/src/modules/design_system/gallery/components/ComponentIndex.tsx +47 -0
- package/src/modules/design_system/gallery/components/DesignSystemHome.tsx +66 -0
- package/src/modules/design_system/gallery/components/EntryCard.tsx +52 -37
- package/src/modules/design_system/gallery/components/EntryHeader.tsx +80 -0
- package/src/modules/design_system/gallery/components/FamilyEntryPreview.tsx +22 -0
- package/src/modules/design_system/gallery/components/FoundationGuide.tsx +43 -0
- package/src/modules/design_system/gallery/components/GalleryLink.tsx +19 -0
- package/src/modules/design_system/gallery/components/GalleryNavigation.tsx +86 -0
- package/src/modules/design_system/gallery/components/GalleryShell.tsx +149 -63
- package/src/modules/design_system/gallery/components/IconsBrowser.tsx +40 -0
- package/src/modules/design_system/gallery/components/SourceLibrary.tsx +90 -0
- package/src/modules/design_system/gallery/components/StyleAgents.tsx +115 -0
- package/src/modules/design_system/gallery/components/ThemeTokenReference.tsx +76 -0
- package/src/modules/design_system/gallery/components/VariantPreview.tsx +2 -2
- package/src/modules/design_system/gallery/components/colorPreview.ts +63 -0
- package/src/modules/design_system/gallery/components/colorStudio.ts +260 -0
- package/src/modules/design_system/gallery/components/styleAgentBranding.ts +42 -0
- package/src/modules/design_system/gallery/components/themeTokens.ts +26 -0
- package/src/modules/design_system/gallery/demos/ai-product-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/ai-product.tsx +188 -0
- package/src/modules/design_system/gallery/demos/buttons.tsx +331 -0
- package/src/modules/design_system/gallery/demos/cryptocurrency.tsx +1943 -0
- package/src/modules/design_system/gallery/demos/feeds-code.generated.ts +4 -0
- package/src/modules/design_system/gallery/demos/feeds.tsx +82 -0
- package/src/modules/design_system/gallery/demos/file-upload.tsx +61 -0
- package/src/modules/design_system/gallery/demos/foundation-reference-data.ts +4872 -0
- package/src/modules/design_system/gallery/demos/foundation-references.tsx +140 -0
- package/src/modules/design_system/gallery/demos/key-components-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/key-components.tsx +106 -0
- package/src/modules/design_system/gallery/demos/marketing-controls-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/marketing-controls.tsx +92 -0
- package/src/modules/design_system/gallery/demos/marketing-widgets-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/marketing-widgets.tsx +189 -0
- package/src/modules/design_system/gallery/demos/menu-fixtures.tsx +48 -0
- package/src/modules/design_system/gallery/demos/menu-sources.ts +5 -0
- package/src/modules/design_system/gallery/demos/menus.tsx +122 -0
- package/src/modules/design_system/gallery/demos/rating-reviews.tsx +44 -0
- package/src/modules/design_system/gallery/demos/registered-icons.tsx +117 -0
- package/src/modules/design_system/gallery/demos/selection-cards.tsx +97 -0
- package/src/modules/design_system/gallery/demos/shell-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/shell.tsx +183 -0
- package/src/modules/design_system/gallery/demos/source-artwork.tsx +88 -0
- package/src/modules/design_system/gallery/demos/source-filters-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/source-filters.tsx +119 -0
- package/src/modules/design_system/gallery/demos/source-icons.tsx +62 -0
- package/src/modules/design_system/gallery/demos/table-cells-code.generated.ts +3 -0
- package/src/modules/design_system/gallery/demos/table-cells.tsx +144 -0
- package/src/modules/design_system/gallery/demos/text-inputs.tsx +90 -0
- package/src/modules/design_system/gallery/demos/time-picker-code.generated.ts +5 -0
- package/src/modules/design_system/gallery/demos/time-picker.tsx +31 -0
- package/src/modules/design_system/gallery/entries/banners.tsx +143 -94
- package/src/modules/design_system/gallery/entries/buttons-snippets.ts +432 -0
- package/src/modules/design_system/gallery/entries/buttons.tsx +125 -196
- package/src/modules/design_system/gallery/entries/charts.tsx +545 -233
- package/src/modules/design_system/gallery/entries/dates.tsx +171 -3
- package/src/modules/design_system/gallery/entries/detail.tsx +142 -115
- package/src/modules/design_system/gallery/entries/display.tsx +1691 -319
- package/src/modules/design_system/gallery/entries/feedback.tsx +1082 -169
- package/src/modules/design_system/gallery/entries/filters.tsx +238 -143
- package/src/modules/design_system/gallery/entries/foundations.tsx +404 -61
- package/src/modules/design_system/gallery/entries/icons.tsx +31 -117
- package/src/modules/design_system/gallery/entries/inputs-snippets.ts +156 -0
- package/src/modules/design_system/gallery/entries/inputs.tsx +2146 -503
- package/src/modules/design_system/gallery/entries/library.tsx +16 -0
- package/src/modules/design_system/gallery/entries/messages.tsx +114 -106
- package/src/modules/design_system/gallery/entries/navigation.tsx +782 -192
- package/src/modules/design_system/gallery/entries/notifications.tsx +145 -120
- package/src/modules/design_system/gallery/entries/overlays.tsx +696 -280
- package/src/modules/design_system/gallery/entries/scaffolding.tsx +1192 -158
- package/src/modules/design_system/gallery/entries/schedule.tsx +72 -58
- package/src/modules/design_system/gallery/presentation.ts +106 -0
- package/src/modules/design_system/gallery/registry.ts +8 -6
- package/src/modules/design_system/gallery/source-library.generated.ts +2 -0
- package/src/modules/design_system/i18n/de.json +7112 -3
- package/src/modules/design_system/i18n/en.json +7112 -3
- package/src/modules/design_system/i18n/es.json +7112 -3
- package/src/modules/design_system/i18n/ko.json +7112 -3
- package/src/modules/design_system/i18n/pl.json +7112 -3
- package/src/modules/push_notifications/AGENTS.md +9 -5
- package/src/modules/push_notifications/lib/queue.ts +15 -44
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
4
|
+
import { cn } from "@open-mercato/shared/lib/utils";
|
|
5
|
+
import { BadgeCheck, Bell, CalendarDays, ChevronDown, ChevronRight, ChevronsUpDown, Cloud, CreditCard, Download, FileText, Folder, Gift, Headphones, Home, Layers, PanelLeftClose, PanelLeftOpen, Pause, Play, Plus, Search, Settings, UserRound, Users, X } from "lucide-react";
|
|
6
|
+
import { PageHeader } from "@open-mercato/ui/backend/Page";
|
|
7
|
+
import { Avatar, AvatarStack } from "@open-mercato/ui/primitives/avatar";
|
|
8
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
9
|
+
import { CompactButton } from "@open-mercato/ui/primitives/compact-button";
|
|
10
|
+
import { IconButton } from "@open-mercato/ui/primitives/icon-button";
|
|
11
|
+
import { LinkButton } from "@open-mercato/ui/primitives/link-button";
|
|
12
|
+
import { Input } from "@open-mercato/ui/primitives/input";
|
|
13
|
+
import { Checkbox } from "@open-mercato/ui/primitives/checkbox";
|
|
14
|
+
import { SearchInput } from "@open-mercato/ui/primitives/search-input";
|
|
15
|
+
import { Progress } from "@open-mercato/ui/primitives/progress";
|
|
16
|
+
import { Popover, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
|
|
17
|
+
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@open-mercato/ui/primitives/dialog";
|
|
18
|
+
import { Sidebar, SidebarContent, SidebarFeatureCard, SidebarFooter, SidebarHeader, SidebarIdentity, SidebarItem, Topbar } from "@open-mercato/ui/primitives/sidebar";
|
|
19
|
+
import { navigationBrandArtwork } from "@open-mercato/ui/assets/navigation-brand-artwork";
|
|
20
|
+
import avatarIllustration from "../assets/avatar-illustration.png";
|
|
21
|
+
import avatarMemoji from "../assets/avatar-memoji.png";
|
|
22
|
+
import avatarPhoto from "../assets/avatar-photo.png";
|
|
23
|
+
const avatarImages = [avatarIllustration, avatarMemoji, avatarPhoto].map((image) => typeof image === "string" ? image : image.src);
|
|
24
|
+
const navItems = {
|
|
25
|
+
hr: ["dashboard", "calendar", "timeOff", "projects", "teams", "integrations", "benefits", "documents"],
|
|
26
|
+
finance: ["dashboard", "cards", "transfer", "transactions", "payments", "exchange"]
|
|
27
|
+
};
|
|
28
|
+
const navIcons = [Home, CalendarDays, CreditCard, Folder, Users, Layers, Gift, FileText];
|
|
29
|
+
function ShellAvatar({ size = 40, product = "hr" }) {
|
|
30
|
+
return /* @__PURE__ */ jsx(Avatar, { src: product === "hr" ? navigationBrandArtwork.sophiaAvatar : navigationBrandArtwork.arthurAvatar, label: product === "hr" ? "Sophia Williams" : "Arthur Taylor", size });
|
|
31
|
+
}
|
|
32
|
+
function WorkspaceIdentity({ product, onProductChange, collapsed = false, profile = false }) {
|
|
33
|
+
const t = useT();
|
|
34
|
+
const [open, setOpen] = React.useState(false);
|
|
35
|
+
const name = product === "hr" ? "Synergy" : "Apex";
|
|
36
|
+
return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
37
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
38
|
+
SidebarIdentity,
|
|
39
|
+
{
|
|
40
|
+
collapsed,
|
|
41
|
+
label: profile ? product === "hr" ? "Sophia Williams" : "Arthur Taylor" : name,
|
|
42
|
+
description: profile ? product === "hr" ? "sophia@example.com" : "arthur@example.com" : t(`design_system.gallery.examples.shell.${product}`),
|
|
43
|
+
leading: profile ? /* @__PURE__ */ jsx(ShellAvatar, { product }) : /* @__PURE__ */ jsx("img", { src: navigationBrandArtwork[product === "hr" ? "synergyOriginal" : "apexOriginal"], alt: "", className: "size-10" }),
|
|
44
|
+
badge: profile ? /* @__PURE__ */ jsx(BadgeCheck, { className: "size-3.5 fill-status-info-icon stroke-status-info-solid-foreground", "aria-hidden": "true" }) : void 0,
|
|
45
|
+
trailing: profile ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-5" }) : /* @__PURE__ */ jsx("span", { className: "flex size-6 items-center justify-center rounded-sm border border-border bg-background shadow-xs", children: /* @__PURE__ */ jsx(ChevronsUpDown, { className: "size-5" }) })
|
|
46
|
+
}
|
|
47
|
+
) }),
|
|
48
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "w-64 p-3", children: profile ? /* @__PURE__ */ jsx("p", { className: "text-sm", children: t("design_system.gallery.examples.shell.localProfile") }) : /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1", children: ["hr", "finance"].map((value) => /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", "aria-pressed": product === value, onClick: () => {
|
|
49
|
+
onProductChange?.(value);
|
|
50
|
+
setOpen(false);
|
|
51
|
+
}, children: value === "hr" ? "Synergy" : "Apex" }, value)) }) })
|
|
52
|
+
] });
|
|
53
|
+
}
|
|
54
|
+
function PageHeaderExample({ appearance = "page", type = "basic", configurable = false }) {
|
|
55
|
+
const t = useT();
|
|
56
|
+
const [options, setOptions] = React.useState({ divider: true, search: true, notification: true, actions: true, second: true, dropdown: false });
|
|
57
|
+
const [query, setQuery] = React.useState("");
|
|
58
|
+
const [dialog, setDialog] = React.useState(false);
|
|
59
|
+
const [draft, setDraft] = React.useState("");
|
|
60
|
+
const [saved, setSaved] = React.useState("");
|
|
61
|
+
const [period, setPeriod] = React.useState("month");
|
|
62
|
+
const [workspace, setWorkspace] = React.useState("hr");
|
|
63
|
+
const submit = () => {
|
|
64
|
+
if (draft.trim()) {
|
|
65
|
+
setSaved(draft.trim());
|
|
66
|
+
setDialog(false);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const copy = (key) => t(`design_system.gallery.examples.shell.${key}`);
|
|
70
|
+
const leading = type === "avatar" ? /* @__PURE__ */ jsx(ShellAvatar, { size: 48 }) : type === "icon" ? /* @__PURE__ */ jsx("span", { className: "flex size-12 items-center justify-center rounded-full border border-border", children: /* @__PURE__ */ jsx(UserRound, { className: "size-6", "aria-hidden": "true" }) }) : type === "brand" ? /* @__PURE__ */ jsx("img", { src: navigationBrandArtwork.loom, alt: "Loom", className: "size-12" }) : type === "company" ? /* @__PURE__ */ jsx("img", { src: navigationBrandArtwork.apexOriginal, alt: "Apex", className: "size-12" }) : void 0;
|
|
71
|
+
const periodMenu = /* @__PURE__ */ jsxs(Popover, { children: [
|
|
72
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", size: "lg", children: [
|
|
73
|
+
/* @__PURE__ */ jsx(CalendarDays, { className: "size-5" }),
|
|
74
|
+
copy(period),
|
|
75
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "size-5" })
|
|
76
|
+
] }) }),
|
|
77
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "p-2", children: ["month", "year"].map((value) => /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", "aria-pressed": period === value, onClick: () => setPeriod(value), children: copy(value) }, value)) })
|
|
78
|
+
] });
|
|
79
|
+
const titleAction = options.dropdown && appearance === "section" ? /* @__PURE__ */ jsxs(Popover, { children: [
|
|
80
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(CompactButton, { fullRadius: true, "aria-label": copy("switchWorkspace"), children: /* @__PURE__ */ jsx(ChevronDown, {}) }) }),
|
|
81
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "p-3", children: ["hr", "finance"].map((value) => /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", onClick: () => setWorkspace(value), children: copy(value) }, value)) })
|
|
82
|
+
] }) : void 0;
|
|
83
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
|
|
84
|
+
configurable ? /* @__PURE__ */ jsx("div", { className: "mb-4 flex flex-wrap gap-4", children: Object.keys(options).map((key) => /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm", children: [
|
|
85
|
+
/* @__PURE__ */ jsx(Checkbox, { checked: options[key], onCheckedChange: (checked) => setOptions((current) => ({ ...current, [key]: checked === true })) }),
|
|
86
|
+
copy(key)
|
|
87
|
+
] }, key)) }) : null,
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
PageHeader,
|
|
90
|
+
{
|
|
91
|
+
appearance,
|
|
92
|
+
leading,
|
|
93
|
+
divider: options.divider,
|
|
94
|
+
title: configurable ? copy(workspace) : copy("title"),
|
|
95
|
+
description: copy("description"),
|
|
96
|
+
titleAction,
|
|
97
|
+
actions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
98
|
+
options.search ? /* @__PURE__ */ jsxs(Popover, { children: [
|
|
99
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { variant: "ghost", className: "size-10 rounded-lg data-[state=open]:bg-muted", "aria-label": copy("search"), children: /* @__PURE__ */ jsx(Search, { className: "size-5" }) }) }),
|
|
100
|
+
/* @__PURE__ */ jsxs(PopoverContent, { className: "p-3", children: [
|
|
101
|
+
/* @__PURE__ */ jsx(SearchInput, { value: query, onChange: setQuery, "aria-label": copy("search") }),
|
|
102
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm", role: "status", children: query ? t("design_system.gallery.examples.shell.localQuery", { query }) : copy("searchHint") })
|
|
103
|
+
] })
|
|
104
|
+
] }) : null,
|
|
105
|
+
options.notification && appearance === "page" ? /* @__PURE__ */ jsxs(Popover, { children: [
|
|
106
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { variant: "ghost", className: "size-10 rounded-lg data-[state=open]:bg-muted", "aria-label": copy("notifications"), children: /* @__PURE__ */ jsx(Bell, { className: "size-5" }) }) }),
|
|
107
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "p-4 text-sm", children: copy("noNotifications") })
|
|
108
|
+
] }) : null,
|
|
109
|
+
options.dropdown && appearance === "page" ? periodMenu : null,
|
|
110
|
+
options.actions ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
111
|
+
options.second ? appearance === "page" ? /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", size: "lg", onClick: () => {
|
|
112
|
+
setDraft("");
|
|
113
|
+
setDialog(true);
|
|
114
|
+
}, children: [
|
|
115
|
+
/* @__PURE__ */ jsx(CalendarDays, { className: "size-5" }),
|
|
116
|
+
copy("schedule")
|
|
117
|
+
] }) : /* @__PURE__ */ jsx(Button, { asChild: true, variant: "outline", size: "lg", children: /* @__PURE__ */ jsxs("a", { download: "page-header-example.json", href: `data:application/json;charset=utf-8,${encodeURIComponent(JSON.stringify({ title: copy("title"), description: copy("description") }, null, 2))}`, children: [
|
|
118
|
+
/* @__PURE__ */ jsx(Download, { className: "size-5" }),
|
|
119
|
+
copy("export")
|
|
120
|
+
] }) }) : null,
|
|
121
|
+
/* @__PURE__ */ jsxs(Button, { type: "button", variant: "primary-filled", size: "lg", onClick: () => {
|
|
122
|
+
setDraft("");
|
|
123
|
+
setDialog(true);
|
|
124
|
+
}, children: [
|
|
125
|
+
/* @__PURE__ */ jsx(Plus, { className: "size-5" }),
|
|
126
|
+
copy(appearance === "page" ? "create" : "invite")
|
|
127
|
+
] })
|
|
128
|
+
] }) : null
|
|
129
|
+
] })
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
saved ? /* @__PURE__ */ jsx("output", { className: "block px-8 pt-3 text-sm", children: t("design_system.gallery.examples.shell.savedDraft", { title: saved }) }) : null,
|
|
133
|
+
/* @__PURE__ */ jsx(Dialog, { open: dialog, onOpenChange: setDialog, children: /* @__PURE__ */ jsxs(DialogContent, { onKeyDown: (event) => {
|
|
134
|
+
if ((event.ctrlKey || event.metaKey) && event.key === "Enter") {
|
|
135
|
+
event.preventDefault();
|
|
136
|
+
submit();
|
|
137
|
+
}
|
|
138
|
+
}, children: [
|
|
139
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
140
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: copy("localDraft") }),
|
|
141
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: copy("localDraftHint") })
|
|
142
|
+
] }),
|
|
143
|
+
/* @__PURE__ */ jsx(Input, { value: draft, onChange: (event) => setDraft(event.target.value), "aria-label": copy("draftTitle"), autoFocus: true }),
|
|
144
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
145
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => setDialog(false), children: copy("cancel") }),
|
|
146
|
+
/* @__PURE__ */ jsx(Button, { type: "button", disabled: !draft.trim(), onClick: submit, children: copy("saveDraft") })
|
|
147
|
+
] })
|
|
148
|
+
] }) })
|
|
149
|
+
] });
|
|
150
|
+
}
|
|
151
|
+
function FeatureCard({ type, appearance }) {
|
|
152
|
+
const t = useT();
|
|
153
|
+
const [dismissed, setDismissed] = React.useState(false);
|
|
154
|
+
const [paused, setPaused] = React.useState(true);
|
|
155
|
+
const [details, setDetails] = React.useState(false);
|
|
156
|
+
const id = React.useId();
|
|
157
|
+
const copy = (key) => t(`design_system.gallery.examples.shell.${key}`);
|
|
158
|
+
const inverse = appearance === "primary" || appearance === "neutral";
|
|
159
|
+
const descriptionClass = inverse ? "text-current" : "text-muted-foreground";
|
|
160
|
+
const link = (key) => /* @__PURE__ */ jsx(LinkButton, { asChild: true, variant: "modifiable", underline: "always", className: type === "link" ? void 0 : "self-start", children: /* @__PURE__ */ jsxs("a", { href: `#${id}`, onClick: () => setDetails(true), children: [
|
|
161
|
+
copy(key),
|
|
162
|
+
type === "meeting" ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-5" }) : null
|
|
163
|
+
] }) });
|
|
164
|
+
if (dismissed) return /* @__PURE__ */ jsx("div", { className: "flex min-h-27 w-58 items-center justify-center rounded-lg border border-dashed border-border", children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => setDismissed(false), children: copy("restoreCard") }) });
|
|
165
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-58 max-w-full", children: [
|
|
166
|
+
/* @__PURE__ */ jsxs(SidebarFeatureCard, { appearance, className: cn("flex flex-col", type === "gift" ? "flex-row items-center gap-3 p-3" : type === "link" || type === "support" ? "gap-3" : "gap-4", type === "link" && "items-center text-center", type === "storage" && "px-2 pt-4 pb-2"), children: [
|
|
167
|
+
type === "meeting" || type === "support" ? /* @__PURE__ */ jsx(CompactButton, { appearance: "modifiable", className: "absolute top-3 right-3 text-current", "aria-label": copy("dismissCard"), onClick: () => setDismissed(true), children: /* @__PURE__ */ jsx(X, {}) }) : null,
|
|
168
|
+
type === "meeting" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
169
|
+
/* @__PURE__ */ jsxs("div", { "data-slot": "sidebar-meeting-avatars", className: "flex w-fit items-center gap-1.5 rounded-full bg-background p-0.5 pr-2 text-foreground ring-1 ring-inset ring-border", children: [
|
|
170
|
+
/* @__PURE__ */ jsx(AvatarStack, { size: 24, max: 3, className: "[&_[data-slot=avatar-stack-item]+[data-slot=avatar-stack-item]]:-ml-0.5", children: avatarImages.map((src, index) => /* @__PURE__ */ jsx(Avatar, { label: String(index + 1), src, size: 24 }, `meeting-avatar-${index}`)) }),
|
|
171
|
+
/* @__PURE__ */ jsx("span", { className: "w-4 text-xs leading-4 text-muted-foreground", children: "+4" })
|
|
172
|
+
] }),
|
|
173
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
174
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: copy("meeting") }),
|
|
175
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-xs", descriptionClass), children: copy("meetingTime") })
|
|
176
|
+
] }),
|
|
177
|
+
link("join")
|
|
178
|
+
] }) : null,
|
|
179
|
+
type === "progress" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
180
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
181
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: copy("capacity") }),
|
|
182
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-xs", descriptionClass), children: copy("capacityHint") })
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsx(Progress, { value: 90, size: "md", "aria-label": copy("capacity"), className: inverse ? "bg-current/20" : void 0, fillClassName: inverse ? "bg-current" : void 0 }),
|
|
185
|
+
link("upgrade")
|
|
186
|
+
] }) : null,
|
|
187
|
+
type === "link" || type === "gift" ? /* @__PURE__ */ jsx("span", { className: cn("flex size-10 shrink-0 items-center justify-center rounded-full", inverse ? "bg-background text-status-info-icon" : "bg-status-info-bg text-status-info-icon"), children: type === "link" ? /* @__PURE__ */ jsx(Cloud, { className: "size-5" }) : /* @__PURE__ */ jsx(Gift, { className: "size-5" }) }) : null,
|
|
188
|
+
type === "link" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
189
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-sm", descriptionClass), children: copy("plansHint") }),
|
|
190
|
+
link("plans")
|
|
191
|
+
] }) : null,
|
|
192
|
+
type === "gift" ? /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
|
|
193
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: copy("gift") }),
|
|
194
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-xs", descriptionClass), children: copy("giftHint") })
|
|
195
|
+
] }) : null,
|
|
196
|
+
type === "storage" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
197
|
+
/* @__PURE__ */ jsxs("div", { className: "px-2", children: [
|
|
198
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-1.5 flex items-center justify-between text-sm", children: [
|
|
199
|
+
/* @__PURE__ */ jsx("span", { children: copy("storage") }),
|
|
200
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs", children: "80%" })
|
|
201
|
+
] }),
|
|
202
|
+
/* @__PURE__ */ jsx(Progress, { value: 80, size: "md", "aria-label": copy("storage"), className: inverse ? "bg-current/20" : void 0, fillClassName: inverse ? "bg-current" : void 0 }),
|
|
203
|
+
/* @__PURE__ */ jsx("p", { className: cn("mt-1.5 text-xs", descriptionClass), children: copy("storageHint") })
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", className: "h-8 w-full justify-start gap-1 rounded-md bg-background px-2.5 py-1.5 text-xs text-foreground hover:bg-muted", "aria-pressed": !paused, onClick: () => setPaused((value) => !value), children: [
|
|
206
|
+
copy("sync"),
|
|
207
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 text-left text-muted-foreground", children: copy(paused ? "paused" : "running") }),
|
|
208
|
+
paused ? /* @__PURE__ */ jsx(Play, { className: "size-5" }) : /* @__PURE__ */ jsx(Pause, { className: "size-5" })
|
|
209
|
+
] })
|
|
210
|
+
] }) : null,
|
|
211
|
+
type === "support" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
212
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5 pr-4", children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Headphones, { className: "size-6" }),
|
|
214
|
+
/* @__PURE__ */ jsx("p", { className: "text-base", children: copy("supportTitle") })
|
|
215
|
+
] }),
|
|
216
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-sm", descriptionClass), children: copy("supportHint") })
|
|
217
|
+
] }) : null
|
|
218
|
+
] }),
|
|
219
|
+
type === "meeting" || type === "progress" || type === "link" ? /* @__PURE__ */ jsx("div", { id, tabIndex: -1, children: details ? /* @__PURE__ */ jsxs("div", { "data-slot": "sidebar-feature-details", className: "mt-3 rounded-md border border-border p-3 text-sm", children: [
|
|
220
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: copy("localDestination") }),
|
|
221
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-muted-foreground", children: copy(type === "meeting" ? "meetingTime" : "plansHint") })
|
|
222
|
+
] }) : null }) : null
|
|
223
|
+
] });
|
|
224
|
+
}
|
|
225
|
+
function SidebarFeatureExample({ type = "meeting" }) {
|
|
226
|
+
return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-wrap items-start gap-6", children: ["stroke", "gray", "primary", "neutral"].map((appearance) => /* @__PURE__ */ jsx(FeatureCard, { type, appearance }, appearance)) });
|
|
227
|
+
}
|
|
228
|
+
function SidebarItemsExample() {
|
|
229
|
+
const t = useT();
|
|
230
|
+
const [selected, setSelected] = React.useState([0, 0]);
|
|
231
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-start gap-6", children: [false, true].map((collapsed, group) => /* @__PURE__ */ jsxs("div", { className: collapsed ? "w-9" : "w-58", children: [
|
|
232
|
+
["dashboard", "calendar", "projects"].map((key, index) => /* @__PURE__ */ jsx(SidebarItem, { collapsed, icon: React.createElement(navIcons[index], { className: "size-5" }), active: selected[group] === index, trailing: /* @__PURE__ */ jsx(ChevronRight, { className: "size-5" }), onClick: () => setSelected((current) => current.map((value, currentGroup) => currentGroup === group ? index : value)), children: t(`design_system.gallery.examples.shell.${key}`) }, key)),
|
|
233
|
+
/* @__PURE__ */ jsx("output", { className: "sr-only", children: t(`design_system.gallery.examples.shell.${["dashboard", "calendar", "projects"][selected[group]]}`) })
|
|
234
|
+
] }, String(collapsed))) });
|
|
235
|
+
}
|
|
236
|
+
function SidebarIdentityExample() {
|
|
237
|
+
const [product, setProduct] = React.useState("hr");
|
|
238
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-start gap-6", children: [false, true].map((collapsed) => /* @__PURE__ */ jsxs("div", { className: collapsed ? "w-16" : "w-62", children: [
|
|
239
|
+
/* @__PURE__ */ jsx(WorkspaceIdentity, { collapsed, product, onProductChange: setProduct }),
|
|
240
|
+
/* @__PURE__ */ jsx(WorkspaceIdentity, { collapsed, product, profile: true })
|
|
241
|
+
] }, String(collapsed))) });
|
|
242
|
+
}
|
|
243
|
+
function SidebarExample({ product = "hr", collapsed = false, feature = false }) {
|
|
244
|
+
const t = useT();
|
|
245
|
+
const [compact, setCompact] = React.useState(collapsed);
|
|
246
|
+
const [workspace, setWorkspace] = React.useState(product);
|
|
247
|
+
const [active, setActive] = React.useState("dashboard");
|
|
248
|
+
const copy = (key) => t(`design_system.gallery.examples.shell.${key}`);
|
|
249
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-wrap items-start gap-6", children: [
|
|
250
|
+
/* @__PURE__ */ jsxs(Sidebar, { collapsed: compact, className: "max-w-full", "aria-label": copy("sidebar"), children: [
|
|
251
|
+
/* @__PURE__ */ jsx(SidebarHeader, { className: "relative after:absolute after:inset-x-5 after:bottom-0 after:border-b after:border-border after:content-['']", children: /* @__PURE__ */ jsx(WorkspaceIdentity, { collapsed: compact, product: workspace, onProductChange: (value) => {
|
|
252
|
+
setWorkspace(value);
|
|
253
|
+
setActive("dashboard");
|
|
254
|
+
} }) }),
|
|
255
|
+
/* @__PURE__ */ jsxs(SidebarContent, { children: [
|
|
256
|
+
/* @__PURE__ */ jsxs("nav", { "aria-label": copy("main"), className: "w-full", children: [
|
|
257
|
+
/* @__PURE__ */ jsx("p", { className: cn("mb-3 px-1 text-xs uppercase text-muted-foreground", compact && "sr-only"), children: copy("main") }),
|
|
258
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1", children: navItems[workspace].map((key, index) => /* @__PURE__ */ jsx(SidebarItem, { icon: React.createElement(navIcons[index], { className: "size-5" }), active: active === key, trailing: active === key ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-5" }) : void 0, className: active === key ? cn("before:absolute before:top-2 before:h-5 before:w-1 before:rounded-r before:bg-foreground before:content-['']", compact ? "before:-left-5.5" : "before:-left-5") : void 0, onClick: () => setActive(key), children: copy(key) }, key)) })
|
|
259
|
+
] }),
|
|
260
|
+
!compact && workspace === "hr" && !feature ? /* @__PURE__ */ jsxs("nav", { "aria-label": copy("favorites"), children: [
|
|
261
|
+
/* @__PURE__ */ jsx("p", { className: "mb-3 px-1 text-xs uppercase text-muted-foreground", children: copy("favorites") }),
|
|
262
|
+
["Loom Mobile App", "Monday Redesign", "Udemy Courses"].map((name, index) => /* @__PURE__ */ jsx(SidebarItem, { icon: /* @__PURE__ */ jsx(Folder, { className: "size-5" }), active: active === name, trailing: /* @__PURE__ */ jsxs("span", { className: "text-xs", children: [
|
|
263
|
+
"\u2318",
|
|
264
|
+
index + 1
|
|
265
|
+
] }), onClick: () => setActive(name), children: name }, name))
|
|
266
|
+
] }) : null,
|
|
267
|
+
/* @__PURE__ */ jsx("nav", { "aria-label": copy("support"), className: "mt-auto w-full", children: ["settings", "support"].map((key) => /* @__PURE__ */ jsx(SidebarItem, { icon: key === "settings" ? /* @__PURE__ */ jsx(Settings, {}) : /* @__PURE__ */ jsx(Headphones, {}), active: active === key, onClick: () => setActive(key), children: copy(key) }, key)) }),
|
|
268
|
+
feature && !compact ? /* @__PURE__ */ jsx(FeatureCard, { type: workspace === "hr" ? "meeting" : "progress", appearance: "stroke" }) : null
|
|
269
|
+
] }),
|
|
270
|
+
/* @__PURE__ */ jsx(SidebarFooter, { children: /* @__PURE__ */ jsx(WorkspaceIdentity, { collapsed: compact, product: workspace, profile: true }) })
|
|
271
|
+
] }),
|
|
272
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 basis-64 space-y-4 py-5", children: [
|
|
273
|
+
/* @__PURE__ */ jsx(IconButton, { variant: "outline", "aria-label": copy(compact ? "expand" : "collapse"), "aria-expanded": !compact, onClick: () => setCompact((value) => !value), children: compact ? /* @__PURE__ */ jsx(PanelLeftOpen, {}) : /* @__PURE__ */ jsx(PanelLeftClose, {}) }),
|
|
274
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-medium", children: navItems[workspace].some((key) => key === active) || ["settings", "support"].includes(active) ? copy(active) : active }),
|
|
275
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: copy("previewHint") })
|
|
276
|
+
] })
|
|
277
|
+
] });
|
|
278
|
+
}
|
|
279
|
+
function TopbarExample({ product = "hr", icons = false }) {
|
|
280
|
+
const t = useT();
|
|
281
|
+
const [active, setActive] = React.useState("dashboard");
|
|
282
|
+
const [query, setQuery] = React.useState("");
|
|
283
|
+
const copy = (key) => t(`design_system.gallery.examples.shell.${key}`);
|
|
284
|
+
const items = product === "hr" ? ["dashboard", "calendar", "timeOff", "projects", "teams", "settings"] : navItems.finance;
|
|
285
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full overflow-x-auto", children: [
|
|
286
|
+
/* @__PURE__ */ jsxs(Topbar, { className: "w-360 flex-nowrap", children: [
|
|
287
|
+
/* @__PURE__ */ jsx("img", { src: navigationBrandArtwork[product === "hr" ? "synergyOriginal" : "apexOriginal"], alt: product === "hr" ? "Synergy" : "Apex", className: "size-10" }),
|
|
288
|
+
/* @__PURE__ */ jsxs("nav", { "aria-label": copy("topbar"), className: "flex min-w-0 flex-1 items-center gap-1", children: [
|
|
289
|
+
items.filter((key) => copy(key).toLocaleLowerCase().includes(query.toLocaleLowerCase())).map((key, index) => /* @__PURE__ */ jsx(SidebarItem, { icon: icons ? React.createElement(navIcons[index], { className: "size-5" }) : null, active: active === key, className: cn("w-auto flex-1 px-2", !icons && "[&>span:first-child]:hidden"), onClick: () => setActive(key), children: copy(key) }, key)),
|
|
290
|
+
/* @__PURE__ */ jsxs(Popover, { children: [
|
|
291
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", className: "h-9 gap-2 px-3", children: [
|
|
292
|
+
copy("others"),
|
|
293
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "size-5" })
|
|
294
|
+
] }) }),
|
|
295
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "p-2", children: ["settings", "support"].map((key) => /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", onClick: () => setActive(key), children: copy(key) }, key)) })
|
|
296
|
+
] })
|
|
297
|
+
] }),
|
|
298
|
+
/* @__PURE__ */ jsx(SearchInput, { value: query, onChange: setQuery, className: "w-58", "aria-label": copy("filterNavigation") }),
|
|
299
|
+
/* @__PURE__ */ jsxs(Popover, { children: [
|
|
300
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { variant: "ghost", className: "size-10 rounded-lg data-[state=open]:bg-muted", "aria-label": copy("notifications"), children: /* @__PURE__ */ jsx(Bell, { className: "size-5" }) }) }),
|
|
301
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "p-4 text-sm", children: copy("noNotifications") })
|
|
302
|
+
] }),
|
|
303
|
+
/* @__PURE__ */ jsxs(Popover, { children: [
|
|
304
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", className: "h-10 gap-1.5 rounded-lg py-1 pr-2 pl-1 data-[state=open]:bg-muted", children: [
|
|
305
|
+
/* @__PURE__ */ jsx(ShellAvatar, { size: 32, product }),
|
|
306
|
+
/* @__PURE__ */ jsx("span", { children: product === "hr" ? "Sophia" : "Arthur" }),
|
|
307
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "size-5" })
|
|
308
|
+
] }) }),
|
|
309
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "p-4 text-sm", children: copy("localProfile") })
|
|
310
|
+
] })
|
|
311
|
+
] }),
|
|
312
|
+
/* @__PURE__ */ jsx("output", { className: "sr-only", children: copy(active) })
|
|
313
|
+
] });
|
|
314
|
+
}
|
|
315
|
+
function NavigationBrandsExample() {
|
|
316
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-6", children: Object.entries(navigationBrandArtwork).filter(([key]) => key !== "loom" && !key.endsWith("Avatar")).map(([key, src]) => /* @__PURE__ */ jsxs("figure", { className: "space-y-2", children: [
|
|
317
|
+
/* @__PURE__ */ jsx("div", { className: cn("flex size-20 items-center justify-center rounded-lg", key.endsWith("White") ? "bg-status-info-solid" : key.endsWith("Black") ? "bg-accent-indigo-foreground" : "bg-background"), children: /* @__PURE__ */ jsx("img", { src, alt: key.startsWith("synergy") ? "Synergy" : "Apex", className: "size-10" }) }),
|
|
318
|
+
/* @__PURE__ */ jsx("figcaption", { className: "text-xs text-muted-foreground", children: key })
|
|
319
|
+
] }, key)) });
|
|
320
|
+
}
|
|
321
|
+
export {
|
|
322
|
+
NavigationBrandsExample,
|
|
323
|
+
PageHeaderExample,
|
|
324
|
+
SidebarExample,
|
|
325
|
+
SidebarFeatureExample,
|
|
326
|
+
SidebarIdentityExample,
|
|
327
|
+
SidebarItemsExample,
|
|
328
|
+
TopbarExample
|
|
329
|
+
};
|
|
330
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/demos/shell.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { BadgeCheck, Bell, CalendarDays, ChevronDown, ChevronRight, ChevronsUpDown, Cloud, CreditCard, Download, FileText, Folder, Gift, Headphones, Home, Layers, PanelLeftClose, PanelLeftOpen, Pause, Play, Plus, Search, Settings, UserRound, Users, X } from 'lucide-react'\nimport { PageHeader } from '@open-mercato/ui/backend/Page'\nimport { Avatar, AvatarStack } from '@open-mercato/ui/primitives/avatar'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { CompactButton } from '@open-mercato/ui/primitives/compact-button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { Progress } from '@open-mercato/ui/primitives/progress'\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Sidebar, SidebarContent, SidebarFeatureCard, SidebarFooter, SidebarHeader, SidebarIdentity, SidebarItem, Topbar } from '@open-mercato/ui/primitives/sidebar'\nimport { navigationBrandArtwork } from '@open-mercato/ui/assets/navigation-brand-artwork'\nimport avatarIllustration from '../assets/avatar-illustration.png'\nimport avatarMemoji from '../assets/avatar-memoji.png'\nimport avatarPhoto from '../assets/avatar-photo.png'\n\nconst avatarImages = [avatarIllustration, avatarMemoji, avatarPhoto].map(image => typeof image === 'string' ? image : image.src)\ntype Product = 'hr' | 'finance'\ntype HeaderType = 'basic' | 'avatar' | 'icon' | 'brand' | 'company'\ntype FeatureType = 'meeting' | 'progress' | 'link' | 'gift' | 'storage' | 'support'\ntype FeatureAppearance = 'stroke' | 'gray' | 'primary' | 'neutral'\nconst navItems = {\n hr: ['dashboard', 'calendar', 'timeOff', 'projects', 'teams', 'integrations', 'benefits', 'documents'],\n finance: ['dashboard', 'cards', 'transfer', 'transactions', 'payments', 'exchange'],\n} as const\nconst navIcons = [Home, CalendarDays, CreditCard, Folder, Users, Layers, Gift, FileText]\n\nfunction ShellAvatar({ size = 40, product = 'hr' }: { size?: 24 | 32 | 40 | 48; product?: Product }) {\n return <Avatar src={product === 'hr' ? navigationBrandArtwork.sophiaAvatar : navigationBrandArtwork.arthurAvatar} label={product === 'hr' ? 'Sophia Williams' : 'Arthur Taylor'} size={size} />\n}\n\nfunction WorkspaceIdentity({ product, onProductChange, collapsed = false, profile = false }: { product: Product; onProductChange?: (product: Product) => void; collapsed?: boolean; profile?: boolean }) {\n const t = useT()\n const [open, setOpen] = React.useState(false)\n const name = product === 'hr' ? 'Synergy' : 'Apex'\n return <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <SidebarIdentity collapsed={collapsed} label={profile ? product === 'hr' ? 'Sophia Williams' : 'Arthur Taylor' : name}\n description={profile ? product === 'hr' ? 'sophia@example.com' : 'arthur@example.com' : t(`design_system.gallery.examples.shell.${product}`)}\n leading={profile ? <ShellAvatar product={product} /> : <img src={navigationBrandArtwork[product === 'hr' ? 'synergyOriginal' : 'apexOriginal']} alt=\"\" className=\"size-10\" />}\n badge={profile ? <BadgeCheck className=\"size-3.5 fill-status-info-icon stroke-status-info-solid-foreground\" aria-hidden=\"true\" /> : undefined}\n trailing={profile ? <ChevronRight className=\"size-5\" /> : <span className=\"flex size-6 items-center justify-center rounded-sm border border-border bg-background shadow-xs\"><ChevronsUpDown className=\"size-5\" /></span>} />\n </PopoverTrigger>\n <PopoverContent className=\"w-64 p-3\">\n {profile ? <p className=\"text-sm\">{t('design_system.gallery.examples.shell.localProfile')}</p> : <div className=\"flex flex-col gap-1\">\n {(['hr', 'finance'] as const).map(value => <Button key={value} type=\"button\" variant=\"ghost\" aria-pressed={product === value} onClick={() => { onProductChange?.(value); setOpen(false) }}>{value === 'hr' ? 'Synergy' : 'Apex'}</Button>)}\n </div>}\n </PopoverContent>\n </Popover>\n}\n\nexport function PageHeaderExample({ appearance = 'page', type = 'basic', configurable = false }: { appearance?: 'page' | 'section'; type?: HeaderType; configurable?: boolean }) {\n const t = useT()\n const [options, setOptions] = React.useState({ divider: true, search: true, notification: true, actions: true, second: true, dropdown: false })\n const [query, setQuery] = React.useState('')\n const [dialog, setDialog] = React.useState(false)\n const [draft, setDraft] = React.useState('')\n const [saved, setSaved] = React.useState('')\n const [period, setPeriod] = React.useState('month')\n const [workspace, setWorkspace] = React.useState<Product>('hr')\n const submit = () => { if (draft.trim()) { setSaved(draft.trim()); setDialog(false) } }\n const copy = (key: string) => t(`design_system.gallery.examples.shell.${key}`)\n const leading = type === 'avatar' ? <ShellAvatar size={48} />\n : type === 'icon' ? <span className=\"flex size-12 items-center justify-center rounded-full border border-border\"><UserRound className=\"size-6\" aria-hidden=\"true\" /></span>\n : type === 'brand' ? <img src={navigationBrandArtwork.loom} alt=\"Loom\" className=\"size-12\" />\n : type === 'company' ? <img src={navigationBrandArtwork.apexOriginal} alt=\"Apex\" className=\"size-12\" /> : undefined\n const periodMenu = <Popover><PopoverTrigger asChild><Button type=\"button\" variant=\"outline\" size=\"lg\"><CalendarDays className=\"size-5\" />{copy(period)}<ChevronDown className=\"size-5\" /></Button></PopoverTrigger><PopoverContent className=\"p-2\">{['month', 'year'].map(value => <Button key={value} type=\"button\" variant=\"ghost\" aria-pressed={period === value} onClick={() => setPeriod(value)}>{copy(value)}</Button>)}</PopoverContent></Popover>\n const titleAction = options.dropdown && appearance === 'section' ? <Popover><PopoverTrigger asChild><CompactButton fullRadius aria-label={copy('switchWorkspace')}><ChevronDown /></CompactButton></PopoverTrigger><PopoverContent className=\"p-3\">{(['hr', 'finance'] as const).map(value => <Button key={value} type=\"button\" variant=\"ghost\" onClick={() => setWorkspace(value)}>{copy(value)}</Button>)}</PopoverContent></Popover> : undefined\n return <div className=\"w-full\">\n {configurable ? <div className=\"mb-4 flex flex-wrap gap-4\">{(Object.keys(options) as Array<keyof typeof options>).map(key => <label key={key} className=\"flex items-center gap-2 text-sm\"><Checkbox checked={options[key]} onCheckedChange={checked => setOptions(current => ({ ...current, [key]: checked === true }))} />{copy(key)}</label>)}</div> : null}\n <PageHeader appearance={appearance} leading={leading} divider={options.divider} title={configurable ? copy(workspace) : copy('title')} description={copy('description')} titleAction={titleAction}\n actions={<>\n {options.search ? <Popover><PopoverTrigger asChild><IconButton variant=\"ghost\" className=\"size-10 rounded-lg data-[state=open]:bg-muted\" aria-label={copy('search')}><Search className=\"size-5\" /></IconButton></PopoverTrigger><PopoverContent className=\"p-3\"><SearchInput value={query} onChange={setQuery} aria-label={copy('search')} /><p className=\"mt-2 text-sm\" role=\"status\">{query ? t('design_system.gallery.examples.shell.localQuery', { query }) : copy('searchHint')}</p></PopoverContent></Popover> : null}\n {options.notification && appearance === 'page' ? <Popover><PopoverTrigger asChild><IconButton variant=\"ghost\" className=\"size-10 rounded-lg data-[state=open]:bg-muted\" aria-label={copy('notifications')}><Bell className=\"size-5\" /></IconButton></PopoverTrigger><PopoverContent className=\"p-4 text-sm\">{copy('noNotifications')}</PopoverContent></Popover> : null}\n {options.dropdown && appearance === 'page' ? periodMenu : null}\n {options.actions ? <>\n {options.second ? appearance === 'page' ? <Button type=\"button\" variant=\"outline\" size=\"lg\" onClick={() => { setDraft(''); setDialog(true) }}><CalendarDays className=\"size-5\" />{copy('schedule')}</Button> : <Button asChild variant=\"outline\" size=\"lg\"><a download=\"page-header-example.json\" href={`data:application/json;charset=utf-8,${encodeURIComponent(JSON.stringify({ title: copy('title'), description: copy('description') }, null, 2))}`}><Download className=\"size-5\" />{copy('export')}</a></Button> : null}\n <Button type=\"button\" variant=\"primary-filled\" size=\"lg\" onClick={() => { setDraft(''); setDialog(true) }}><Plus className=\"size-5\" />{copy(appearance === 'page' ? 'create' : 'invite')}</Button>\n </> : null}\n </>} />\n {saved ? <output className=\"block px-8 pt-3 text-sm\">{t('design_system.gallery.examples.shell.savedDraft', { title: saved })}</output> : null}\n <Dialog open={dialog} onOpenChange={setDialog}><DialogContent onKeyDown={event => { if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') { event.preventDefault(); submit() } }}>\n <DialogHeader><DialogTitle>{copy('localDraft')}</DialogTitle><DialogDescription>{copy('localDraftHint')}</DialogDescription></DialogHeader>\n <Input value={draft} onChange={event => setDraft(event.target.value)} aria-label={copy('draftTitle')} autoFocus />\n <DialogFooter><Button type=\"button\" variant=\"outline\" onClick={() => setDialog(false)}>{copy('cancel')}</Button><Button type=\"button\" disabled={!draft.trim()} onClick={submit}>{copy('saveDraft')}</Button></DialogFooter>\n </DialogContent></Dialog>\n </div>\n}\n\nfunction FeatureCard({ type, appearance }: { type: FeatureType; appearance: FeatureAppearance }) {\n const t = useT()\n const [dismissed, setDismissed] = React.useState(false)\n const [paused, setPaused] = React.useState(true)\n const [details, setDetails] = React.useState(false)\n const id = React.useId()\n const copy = (key: string) => t(`design_system.gallery.examples.shell.${key}`)\n const inverse = appearance === 'primary' || appearance === 'neutral'\n const descriptionClass = inverse ? 'text-current' : 'text-muted-foreground'\n const link = (key: string) => <LinkButton asChild variant=\"modifiable\" underline=\"always\" className={type === 'link' ? undefined : 'self-start'}><a href={`#${id}`} onClick={() => setDetails(true)}>{copy(key)}{type === 'meeting' ? <ChevronRight className=\"size-5\" /> : null}</a></LinkButton>\n if (dismissed) return <div className=\"flex min-h-27 w-58 items-center justify-center rounded-lg border border-dashed border-border\"><Button type=\"button\" variant=\"outline\" onClick={() => setDismissed(false)}>{copy('restoreCard')}</Button></div>\n return <div className=\"w-58 max-w-full\">\n <SidebarFeatureCard appearance={appearance} className={cn('flex flex-col', type === 'gift' ? 'flex-row items-center gap-3 p-3' : type === 'link' || type === 'support' ? 'gap-3' : 'gap-4', type === 'link' && 'items-center text-center', type === 'storage' && 'px-2 pt-4 pb-2')}>\n {(type === 'meeting' || type === 'support') ? <CompactButton appearance=\"modifiable\" className=\"absolute top-3 right-3 text-current\" aria-label={copy('dismissCard')} onClick={() => setDismissed(true)}><X /></CompactButton> : null}\n {type === 'meeting' ? <>\n <div data-slot=\"sidebar-meeting-avatars\" className=\"flex w-fit items-center gap-1.5 rounded-full bg-background p-0.5 pr-2 text-foreground ring-1 ring-inset ring-border\"><AvatarStack size={24} max={3} className=\"[&_[data-slot=avatar-stack-item]+[data-slot=avatar-stack-item]]:-ml-0.5\">{avatarImages.map((src, index) => <Avatar key={`meeting-avatar-${index}`} label={String(index + 1)} src={src} size={24} />)}</AvatarStack><span className=\"w-4 text-xs leading-4 text-muted-foreground\">+4</span></div>\n <div className=\"flex flex-col gap-1\"><p className=\"text-sm font-medium\">{copy('meeting')}</p><p className={cn('text-xs', descriptionClass)}>{copy('meetingTime')}</p></div>{link('join')}\n </> : null}\n {type === 'progress' ? <><div className=\"flex flex-col gap-1\"><p className=\"text-sm font-medium\">{copy('capacity')}</p><p className={cn('text-xs', descriptionClass)}>{copy('capacityHint')}</p></div><Progress value={90} size=\"md\" aria-label={copy('capacity')} className={inverse ? 'bg-current/20' : undefined} fillClassName={inverse ? 'bg-current' : undefined} />{link('upgrade')}</> : null}\n {(type === 'link' || type === 'gift') ? <span className={cn('flex size-10 shrink-0 items-center justify-center rounded-full', inverse ? 'bg-background text-status-info-icon' : 'bg-status-info-bg text-status-info-icon')}>{type === 'link' ? <Cloud className=\"size-5\" /> : <Gift className=\"size-5\" />}</span> : null}\n {type === 'link' ? <><p className={cn('text-sm', descriptionClass)}>{copy('plansHint')}</p>{link('plans')}</> : null}\n {type === 'gift' ? <div className=\"flex min-w-0 flex-col gap-1\"><p className=\"text-sm font-medium\">{copy('gift')}</p><p className={cn('text-xs', descriptionClass)}>{copy('giftHint')}</p></div> : null}\n {type === 'storage' ? <><div className=\"px-2\"><div className=\"mb-1.5 flex items-center justify-between text-sm\"><span>{copy('storage')}</span><span className=\"text-xs\">80%</span></div><Progress value={80} size=\"md\" aria-label={copy('storage')} className={inverse ? 'bg-current/20' : undefined} fillClassName={inverse ? 'bg-current' : undefined} /><p className={cn('mt-1.5 text-xs', descriptionClass)}>{copy('storageHint')}</p></div><Button type=\"button\" variant=\"ghost\" className=\"h-8 w-full justify-start gap-1 rounded-md bg-background px-2.5 py-1.5 text-xs text-foreground hover:bg-muted\" aria-pressed={!paused} onClick={() => setPaused(value => !value)}>{copy('sync')}<span className=\"flex-1 text-left text-muted-foreground\">{copy(paused ? 'paused' : 'running')}</span>{paused ? <Play className=\"size-5\" /> : <Pause className=\"size-5\" />}</Button></> : null}\n {type === 'support' ? <><div className=\"flex items-center gap-2.5 pr-4\"><Headphones className=\"size-6\" /><p className=\"text-base\">{copy('supportTitle')}</p></div><p className={cn('text-sm', descriptionClass)}>{copy('supportHint')}</p></> : null}\n </SidebarFeatureCard>\n {(type === 'meeting' || type === 'progress' || type === 'link') ? <div id={id} tabIndex={-1}>{details ? <div data-slot=\"sidebar-feature-details\" className=\"mt-3 rounded-md border border-border p-3 text-sm\"><p className=\"font-medium\">{copy('localDestination')}</p><p className=\"mt-1 text-muted-foreground\">{copy(type === 'meeting' ? 'meetingTime' : 'plansHint')}</p></div> : null}</div> : null}\n </div>\n}\n\nexport function SidebarFeatureExample({ type = 'meeting' }: { type?: FeatureType }) {\n return <div className=\"flex w-full flex-wrap items-start gap-6\">{(['stroke', 'gray', 'primary', 'neutral'] as const).map(appearance => <FeatureCard key={appearance} type={type} appearance={appearance} />)}</div>\n}\n\nexport function SidebarItemsExample() {\n const t = useT()\n const [selected, setSelected] = React.useState([0, 0])\n return <div className=\"flex flex-wrap items-start gap-6\">{[false, true].map((collapsed, group) => <div key={String(collapsed)} className={collapsed ? 'w-9' : 'w-58'}>\n {['dashboard', 'calendar', 'projects'].map((key, index) => <SidebarItem key={key} collapsed={collapsed} icon={React.createElement(navIcons[index], { className: 'size-5' })} active={selected[group] === index} trailing={<ChevronRight className=\"size-5\" />} onClick={() => setSelected(current => current.map((value, currentGroup) => currentGroup === group ? index : value))}>{t(`design_system.gallery.examples.shell.${key}`)}</SidebarItem>)}\n <output className=\"sr-only\">{t(`design_system.gallery.examples.shell.${['dashboard', 'calendar', 'projects'][selected[group]]}`)}</output>\n </div>)}</div>\n}\n\nexport function SidebarIdentityExample() {\n const [product, setProduct] = React.useState<Product>('hr')\n return <div className=\"flex flex-wrap items-start gap-6\">{[false, true].map(collapsed => <div key={String(collapsed)} className={collapsed ? 'w-16' : 'w-62'}><WorkspaceIdentity collapsed={collapsed} product={product} onProductChange={setProduct} /><WorkspaceIdentity collapsed={collapsed} product={product} profile /></div>)}</div>\n}\n\nexport function SidebarExample({ product = 'hr', collapsed = false, feature = false }: { product?: Product; collapsed?: boolean; feature?: boolean }) {\n const t = useT()\n const [compact, setCompact] = React.useState(collapsed)\n const [workspace, setWorkspace] = React.useState(product)\n const [active, setActive] = React.useState('dashboard')\n const copy = (key: string) => t(`design_system.gallery.examples.shell.${key}`)\n return <div className=\"flex w-full flex-wrap items-start gap-6\">\n <Sidebar collapsed={compact} className=\"max-w-full\" aria-label={copy('sidebar')}>\n <SidebarHeader className=\"relative after:absolute after:inset-x-5 after:bottom-0 after:border-b after:border-border after:content-['']\"><WorkspaceIdentity collapsed={compact} product={workspace} onProductChange={value => { setWorkspace(value); setActive('dashboard') }} /></SidebarHeader>\n <SidebarContent>\n <nav aria-label={copy('main')} className=\"w-full\"><p className={cn('mb-3 px-1 text-xs uppercase text-muted-foreground', compact && 'sr-only')}>{copy('main')}</p><div className=\"flex flex-col gap-1\">\n {navItems[workspace].map((key, index) => <SidebarItem key={key} icon={React.createElement(navIcons[index], { className: 'size-5' })} active={active === key} trailing={active === key ? <ChevronRight className=\"size-5\" /> : undefined} className={active === key ? cn(\"before:absolute before:top-2 before:h-5 before:w-1 before:rounded-r before:bg-foreground before:content-['']\", compact ? 'before:-left-5.5' : 'before:-left-5') : undefined} onClick={() => setActive(key)}>{copy(key)}</SidebarItem>)}\n </div></nav>\n {!compact && workspace === 'hr' && !feature ? <nav aria-label={copy('favorites')}><p className=\"mb-3 px-1 text-xs uppercase text-muted-foreground\">{copy('favorites')}</p>{['Loom Mobile App', 'Monday Redesign', 'Udemy Courses'].map((name, index) => <SidebarItem key={name} icon={<Folder className=\"size-5\" />} active={active === name} trailing={<span className=\"text-xs\">\u2318{index + 1}</span>} onClick={() => setActive(name)}>{name}</SidebarItem>)}</nav> : null}\n <nav aria-label={copy('support')} className=\"mt-auto w-full\">{['settings', 'support'].map(key => <SidebarItem key={key} icon={key === 'settings' ? <Settings /> : <Headphones />} active={active === key} onClick={() => setActive(key)}>{copy(key)}</SidebarItem>)}</nav>\n {feature && !compact ? <FeatureCard type={workspace === 'hr' ? 'meeting' : 'progress'} appearance=\"stroke\" /> : null}\n </SidebarContent>\n <SidebarFooter><WorkspaceIdentity collapsed={compact} product={workspace} profile /></SidebarFooter>\n </Sidebar>\n <div className=\"min-w-0 flex-1 basis-64 space-y-4 py-5\"><IconButton variant=\"outline\" aria-label={copy(compact ? 'expand' : 'collapse')} aria-expanded={!compact} onClick={() => setCompact(value => !value)}>{compact ? <PanelLeftOpen /> : <PanelLeftClose />}</IconButton><h3 className=\"text-lg font-medium\">{navItems[workspace].some(key => key === active) || ['settings', 'support'].includes(active) ? copy(active) : active}</h3><p className=\"text-sm text-muted-foreground\">{copy('previewHint')}</p></div>\n </div>\n}\n\nexport function TopbarExample({ product = 'hr', icons = false }: { product?: Product; icons?: boolean }) {\n const t = useT()\n const [active, setActive] = React.useState('dashboard')\n const [query, setQuery] = React.useState('')\n const copy = (key: string) => t(`design_system.gallery.examples.shell.${key}`)\n const items = product === 'hr' ? ['dashboard', 'calendar', 'timeOff', 'projects', 'teams', 'settings'] : navItems.finance\n return <div className=\"w-full overflow-x-auto\"><Topbar className=\"w-360 flex-nowrap\">\n <img src={navigationBrandArtwork[product === 'hr' ? 'synergyOriginal' : 'apexOriginal']} alt={product === 'hr' ? 'Synergy' : 'Apex'} className=\"size-10\" />\n <nav aria-label={copy('topbar')} className=\"flex min-w-0 flex-1 items-center gap-1\">{items.filter(key => copy(key).toLocaleLowerCase().includes(query.toLocaleLowerCase())).map((key, index) => <SidebarItem key={key} icon={icons ? React.createElement(navIcons[index], { className: 'size-5' }) : null} active={active === key} className={cn('w-auto flex-1 px-2', !icons && '[&>span:first-child]:hidden')} onClick={() => setActive(key)}>{copy(key)}</SidebarItem>)}<Popover><PopoverTrigger asChild><Button type=\"button\" variant=\"ghost\" className=\"h-9 gap-2 px-3\">{copy('others')}<ChevronDown className=\"size-5\" /></Button></PopoverTrigger><PopoverContent className=\"p-2\">{['settings', 'support'].map(key => <Button key={key} type=\"button\" variant=\"ghost\" onClick={() => setActive(key)}>{copy(key)}</Button>)}</PopoverContent></Popover></nav>\n <SearchInput value={query} onChange={setQuery} className=\"w-58\" aria-label={copy('filterNavigation')} />\n <Popover><PopoverTrigger asChild><IconButton variant=\"ghost\" className=\"size-10 rounded-lg data-[state=open]:bg-muted\" aria-label={copy('notifications')}><Bell className=\"size-5\" /></IconButton></PopoverTrigger><PopoverContent className=\"p-4 text-sm\">{copy('noNotifications')}</PopoverContent></Popover>\n <Popover><PopoverTrigger asChild><Button type=\"button\" variant=\"ghost\" className=\"h-10 gap-1.5 rounded-lg py-1 pr-2 pl-1 data-[state=open]:bg-muted\"><ShellAvatar size={32} product={product} /><span>{product === 'hr' ? 'Sophia' : 'Arthur'}</span><ChevronDown className=\"size-5\" /></Button></PopoverTrigger><PopoverContent className=\"p-4 text-sm\">{copy('localProfile')}</PopoverContent></Popover>\n </Topbar><output className=\"sr-only\">{copy(active)}</output></div>\n}\n\nexport function NavigationBrandsExample() {\n return <div className=\"flex flex-wrap gap-6\">{Object.entries(navigationBrandArtwork).filter(([key]) => key !== 'loom' && !key.endsWith('Avatar')).map(([key, src]) => <figure key={key} className=\"space-y-2\"><div className={cn('flex size-20 items-center justify-center rounded-lg', key.endsWith('White') ? 'bg-status-info-solid' : key.endsWith('Black') ? 'bg-accent-indigo-foreground' : 'bg-background')}><img src={src} alt={key.startsWith('synergy') ? 'Synergy' : 'Apex'} className=\"size-10\" /></div><figcaption className=\"text-xs text-muted-foreground\">{key}</figcaption></figure>)}</div>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "@open-mercato/shared/lib/utils";
|
|
4
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
5
|
+
import { loadSourceArtwork } from "@open-mercato/ui/assets/source-artwork";
|
|
6
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
7
|
+
import { SearchInput } from "@open-mercato/ui/primitives/search-input";
|
|
8
|
+
import { Pagination } from "@open-mercato/ui/primitives/pagination";
|
|
9
|
+
import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
|
|
10
|
+
import { Popover, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
|
|
11
|
+
import { LoadingMessage, ErrorMessage } from "@open-mercato/ui/backend/detail";
|
|
12
|
+
const pageSize = 48;
|
|
13
|
+
function ArtworkTile({ asset, group, duplicate }) {
|
|
14
|
+
const t = useT();
|
|
15
|
+
const [notice, setNotice] = React.useState("");
|
|
16
|
+
const illustration = group === "thumbnails";
|
|
17
|
+
const name = illustration ? t(`design_system.gallery.thumbnailNames.${asset.name}`, asset.name) : asset.name;
|
|
18
|
+
const category = illustration ? t(`design_system.gallery.thumbnailCategories.${asset.category}`, asset.category) : asset.category;
|
|
19
|
+
const label = duplicate ? `${name} (${illustration ? category : asset.id})` : name;
|
|
20
|
+
async function copy() {
|
|
21
|
+
const code = `import { loadSourceArtwork } from '@open-mercato/ui/assets/source-artwork'
|
|
22
|
+
|
|
23
|
+
const assets = await loadSourceArtwork('${group}')
|
|
24
|
+
const asset = assets.find(item => item.id === '${asset.id}')
|
|
25
|
+
|
|
26
|
+
<img src={asset?.src} width={asset?.width} height={asset?.height} alt="" />`;
|
|
27
|
+
try {
|
|
28
|
+
await navigator.clipboard.writeText(code);
|
|
29
|
+
setNotice(t("design_system.gallery.sourceIcons.copied"));
|
|
30
|
+
} catch {
|
|
31
|
+
setNotice(t("design_system.gallery.copyFailed"));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return /* @__PURE__ */ jsxs(Popover, { onOpenChange: () => setNotice(""), children: [
|
|
35
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", "data-source-node": asset.id, "aria-label": label, className: "h-auto min-h-36 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("span", { className: cn("flex w-full items-center justify-center rounded-md bg-muted p-2", illustration ? "h-40" : "h-20"), children: /* @__PURE__ */ jsx("img", { src: asset.src, width: asset.width, height: asset.height, alt: "", loading: "lazy", className: "max-h-full max-w-full object-contain drop-shadow-sm" }) }),
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: "max-w-full break-words text-center text-xs font-normal leading-4", children: name })
|
|
38
|
+
] }) }),
|
|
39
|
+
/* @__PURE__ */ jsxs(PopoverContent, { className: cn("space-y-4 p-4", illustration ? "w-80" : "w-72"), "aria-label": label, children: [
|
|
40
|
+
/* @__PURE__ */ jsx("div", { className: cn("flex items-center justify-center rounded-md bg-status-neutral-solid p-4", illustration ? "h-64" : "h-32"), children: /* @__PURE__ */ jsx("img", { src: asset.src, width: asset.width, height: asset.height, alt: "", className: "max-h-full max-w-full object-contain" }) }),
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
42
|
+
/* @__PURE__ */ jsx("p", { className: "break-words font-medium", children: name }),
|
|
43
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
44
|
+
category,
|
|
45
|
+
" \xB7 ",
|
|
46
|
+
asset.width,
|
|
47
|
+
" \xD7 ",
|
|
48
|
+
asset.height
|
|
49
|
+
] })
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: copy, children: t("design_system.gallery.sourceIcons.copy") }),
|
|
52
|
+
notice ? /* @__PURE__ */ jsx("p", { role: "status", className: "text-xs text-muted-foreground", children: notice }) : null
|
|
53
|
+
] })
|
|
54
|
+
] });
|
|
55
|
+
}
|
|
56
|
+
function SourceArtworkCatalogue({ group, collectionControl }) {
|
|
57
|
+
const t = useT();
|
|
58
|
+
const [assets, setAssets] = React.useState(null);
|
|
59
|
+
const [failed, setFailed] = React.useState(false);
|
|
60
|
+
const [attempt, setAttempt] = React.useState(0);
|
|
61
|
+
const [query, setQuery] = React.useState("");
|
|
62
|
+
const [page, setPage] = React.useState(1);
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
let active = true;
|
|
65
|
+
setAssets(null);
|
|
66
|
+
setFailed(false);
|
|
67
|
+
setPage(1);
|
|
68
|
+
setQuery("");
|
|
69
|
+
loadSourceArtwork(group).then((items) => {
|
|
70
|
+
if (active) setAssets(items);
|
|
71
|
+
}).catch(() => {
|
|
72
|
+
if (active) setFailed(true);
|
|
73
|
+
});
|
|
74
|
+
return () => {
|
|
75
|
+
active = false;
|
|
76
|
+
};
|
|
77
|
+
}, [group, attempt]);
|
|
78
|
+
if (failed) return /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
|
|
79
|
+
collectionControl,
|
|
80
|
+
/* @__PURE__ */ jsx(ErrorMessage, { label: t("design_system.gallery.loadFailed"), action: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => setAttempt((value) => value + 1), children: t("design_system.gallery.retry") }) })
|
|
81
|
+
] });
|
|
82
|
+
if (!assets) return /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
|
|
83
|
+
collectionControl,
|
|
84
|
+
/* @__PURE__ */ jsx(LoadingMessage, { label: t("design_system.gallery.sourceArtwork.loading") })
|
|
85
|
+
] });
|
|
86
|
+
const needle = query.trim().toLowerCase();
|
|
87
|
+
const nameCounts = /* @__PURE__ */ new Map();
|
|
88
|
+
for (const asset of assets) nameCounts.set(asset.name, (nameCounts.get(asset.name) ?? 0) + 1);
|
|
89
|
+
const filtered = assets.filter((asset) => {
|
|
90
|
+
const translated = group === "thumbnails" ? `${t(`design_system.gallery.thumbnailNames.${asset.name}`, asset.name)} ${t(`design_system.gallery.thumbnailCategories.${asset.category}`, asset.category)}` : "";
|
|
91
|
+
return `${asset.name} ${asset.category} ${translated}`.toLowerCase().includes(needle);
|
|
92
|
+
});
|
|
93
|
+
const visible = filtered.slice((page - 1) * pageSize, page * pageSize);
|
|
94
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-5", "data-example": "source-artwork-catalogue", "data-collection": group, children: [
|
|
95
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-4", children: [
|
|
96
|
+
collectionControl,
|
|
97
|
+
/* @__PURE__ */ jsx(SearchInput, { value: query, onChange: (value) => {
|
|
98
|
+
setQuery(value);
|
|
99
|
+
setPage(1);
|
|
100
|
+
}, className: "w-80 max-w-full", "aria-label": t("design_system.gallery.sourceArtwork.search"), placeholder: t("design_system.gallery.sourceArtwork.search") }),
|
|
101
|
+
/* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceArtwork.count", { visible: filtered.length, total: assets.length }) })
|
|
102
|
+
] }),
|
|
103
|
+
visible.length ? /* @__PURE__ */ jsx("div", { className: cn("grid gap-3", group === "thumbnails" ? "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5"), children: visible.map((asset) => /* @__PURE__ */ jsx(ArtworkTile, { asset, group, duplicate: (nameCounts.get(asset.name) ?? 0) > 1 }, asset.id)) }) : /* @__PURE__ */ jsx(EmptyState, { title: t("design_system.gallery.noResults") }),
|
|
104
|
+
filtered.length > pageSize ? /* @__PURE__ */ jsx(Pagination, { page, pageSize, total: filtered.length, showPageSize: false, onPageChange: setPage, "aria-label": t("design_system.gallery.sourceArtwork.pages") }) : null
|
|
105
|
+
] });
|
|
106
|
+
}
|
|
107
|
+
function sourceArtworkCode(group) {
|
|
108
|
+
return `import { loadSourceArtwork } from '@open-mercato/ui/assets/source-artwork'
|
|
109
|
+
|
|
110
|
+
const artwork = await loadSourceArtwork('${group}')
|
|
111
|
+
|
|
112
|
+
<div className="flex flex-wrap gap-4">
|
|
113
|
+
{artwork.slice(0, 24).map(asset => <img key={asset.id} src={asset.src} width={asset.width} height={asset.height} alt={asset.name} />)}
|
|
114
|
+
</div>`;
|
|
115
|
+
}
|
|
116
|
+
export {
|
|
117
|
+
SourceArtworkCatalogue,
|
|
118
|
+
sourceArtworkCode
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=source-artwork.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/demos/source-artwork.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { loadSourceArtwork, type SourceArtwork, type SourceArtworkGroup } from '@open-mercato/ui/assets/source-artwork'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { Pagination } from '@open-mercato/ui/primitives/pagination'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\nimport { LoadingMessage, ErrorMessage } from '@open-mercato/ui/backend/detail'\n\nconst pageSize = 48\n\nfunction ArtworkTile({ asset, group, duplicate }: { asset: SourceArtwork; group: SourceArtworkGroup; duplicate: boolean }) {\n const t = useT()\n const [notice, setNotice] = React.useState('')\n const illustration = group === 'thumbnails'\n const name = illustration ? t(`design_system.gallery.thumbnailNames.${asset.name}`, asset.name) : asset.name\n const category = illustration ? t(`design_system.gallery.thumbnailCategories.${asset.category}`, asset.category) : asset.category\n const label = duplicate ? `${name} (${illustration ? category : asset.id})` : name\n async function copy() {\n const code = `import { loadSourceArtwork } from '@open-mercato/ui/assets/source-artwork'\\n\\nconst assets = await loadSourceArtwork('${group}')\\nconst asset = assets.find(item => item.id === '${asset.id}')\\n\\n<img src={asset?.src} width={asset?.width} height={asset?.height} alt=\"\" />`\n try { await navigator.clipboard.writeText(code); setNotice(t('design_system.gallery.sourceIcons.copied')) }\n catch { setNotice(t('design_system.gallery.copyFailed')) }\n }\n return <Popover onOpenChange={() => setNotice('')}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" data-source-node={asset.id} aria-label={label} className=\"h-auto min-h-36 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3\">\n <span className={cn(\"flex w-full items-center justify-center rounded-md bg-muted p-2\", illustration ? \"h-40\" : \"h-20\")}><img src={asset.src} width={asset.width} height={asset.height} alt=\"\" loading=\"lazy\" className=\"max-h-full max-w-full object-contain drop-shadow-sm\" /></span>\n <span className=\"max-w-full break-words text-center text-xs font-normal leading-4\">{name}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className={cn(\"space-y-4 p-4\", illustration ? \"w-80\" : \"w-72\")} aria-label={label}>\n <div className={cn(\"flex items-center justify-center rounded-md bg-status-neutral-solid p-4\", illustration ? \"h-64\" : \"h-32\")}><img src={asset.src} width={asset.width} height={asset.height} alt=\"\" className=\"max-h-full max-w-full object-contain\" /></div>\n <div><p className=\"break-words font-medium\">{name}</p><p className=\"text-xs text-muted-foreground\">{category} \u00B7 {asset.width} \u00D7 {asset.height}</p></div>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={copy}>{t('design_system.gallery.sourceIcons.copy')}</Button>\n {notice ? <p role=\"status\" className=\"text-xs text-muted-foreground\">{notice}</p> : null}\n </PopoverContent>\n </Popover>\n}\n\nexport function SourceArtworkCatalogue({ group, collectionControl }: { group: SourceArtworkGroup; collectionControl?: React.ReactNode }) {\n const t = useT()\n const [assets, setAssets] = React.useState<readonly SourceArtwork[] | null>(null)\n const [failed, setFailed] = React.useState(false)\n const [attempt, setAttempt] = React.useState(0)\n const [query, setQuery] = React.useState('')\n const [page, setPage] = React.useState(1)\n\n React.useEffect(() => {\n let active = true\n setAssets(null)\n setFailed(false)\n setPage(1)\n setQuery('')\n loadSourceArtwork(group).then(items => {\n if (active) setAssets(items)\n }).catch(() => { if (active) setFailed(true) })\n return () => { active = false }\n }, [group, attempt])\n\n if (failed) return <div className=\"space-y-5\">{collectionControl}<ErrorMessage label={t('design_system.gallery.loadFailed')} action={<Button type=\"button\" variant=\"outline\" onClick={() => setAttempt(value => value + 1)}>{t('design_system.gallery.retry')}</Button>} /></div>\n if (!assets) return <div className=\"space-y-5\">{collectionControl}<LoadingMessage label={t('design_system.gallery.sourceArtwork.loading')} /></div>\n const needle = query.trim().toLowerCase()\n const nameCounts = new Map<string, number>()\n for (const asset of assets) nameCounts.set(asset.name, (nameCounts.get(asset.name) ?? 0) + 1)\n const filtered = assets.filter(asset => {\n const translated = group === 'thumbnails' ? `${t(`design_system.gallery.thumbnailNames.${asset.name}`, asset.name)} ${t(`design_system.gallery.thumbnailCategories.${asset.category}`, asset.category)}` : ''\n return `${asset.name} ${asset.category} ${translated}`.toLowerCase().includes(needle)\n })\n const visible = filtered.slice((page - 1) * pageSize, page * pageSize)\n\n return <div className=\"w-full min-w-0 space-y-5\" data-example=\"source-artwork-catalogue\" data-collection={group}>\n <div className=\"flex flex-wrap items-center gap-4\">\n {collectionControl}\n <SearchInput value={query} onChange={value => { setQuery(value); setPage(1) }} className=\"w-80 max-w-full\" aria-label={t('design_system.gallery.sourceArtwork.search')} placeholder={t('design_system.gallery.sourceArtwork.search')} />\n <p role=\"status\" className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceArtwork.count', { visible: filtered.length, total: assets.length })}</p>\n </div>\n {visible.length ? <div className={cn(\"grid gap-3\", group === \"thumbnails\" ? \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\" : \"grid-cols-2 sm:grid-cols-3 lg:grid-cols-5\")}>\n {visible.map(asset => <ArtworkTile key={asset.id} asset={asset} group={group} duplicate={(nameCounts.get(asset.name) ?? 0) > 1} />)}\n </div> : <EmptyState title={t('design_system.gallery.noResults')} />}\n {filtered.length > pageSize ? <Pagination page={page} pageSize={pageSize} total={filtered.length} showPageSize={false} onPageChange={setPage} aria-label={t('design_system.gallery.sourceArtwork.pages')} /> : null}\n </div>\n}\n\nexport function sourceArtworkCode(group: SourceArtworkGroup) {\n return `import { loadSourceArtwork } from '@open-mercato/ui/assets/source-artwork'\\n\\nconst artwork = await loadSourceArtwork('${group}')\\n\\n<div className=\"flex flex-wrap gap-4\">\\n {artwork.slice(0, 24).map(asset => <img key={asset.id} src={asset.src} width={asset.width} height={asset.height} alt={asset.name} />)}\\n</div>`\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|