@open-mercato/core 0.7.1-develop.7203.1.9396450b78 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 -9
- 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,125 @@
|
|
|
1
|
+
const source = `import * as React from 'react'
|
|
2
|
+
import { CalendarDays, Check, Filter, Settings2 } from 'lucide-react'
|
|
3
|
+
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
4
|
+
import { Button } from '@open-mercato/ui/primitives/button'
|
|
5
|
+
import { ButtonGroup } from '@open-mercato/ui/primitives/button-group'
|
|
6
|
+
import { Calendar } from '@open-mercato/ui/primitives/calendar'
|
|
7
|
+
import { CheckboxField } from '@open-mercato/ui/primitives/checkbox-field'
|
|
8
|
+
import { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from '@open-mercato/ui/primitives/filter-toolbar'
|
|
9
|
+
import { IconButton } from '@open-mercato/ui/primitives/icon-button'
|
|
10
|
+
import { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'
|
|
11
|
+
import { SearchInput } from '@open-mercato/ui/primitives/search-input'
|
|
12
|
+
import { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'
|
|
13
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'
|
|
14
|
+
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@open-mercato/ui/primitives/table'
|
|
15
|
+
|
|
16
|
+
type Filters = { date?: Date; statuses: string[] }
|
|
17
|
+
const transactionRows = [
|
|
18
|
+
{ name: 'Apex', type: 'income', date: new Date(2023, 7, 11), amount: 1240, status: 'completed' },
|
|
19
|
+
{ name: 'Spotify', type: 'expense', date: new Date(2023, 7, 10), amount: -12, status: 'completed' },
|
|
20
|
+
{ name: 'Synergy', type: 'income', date: new Date(2023, 7, 9), amount: 680, status: 'pending' },
|
|
21
|
+
{ name: 'Loom', type: 'expense', date: new Date(2023, 7, 11), amount: -18, status: 'pending' },
|
|
22
|
+
]
|
|
23
|
+
const emptyFilters = (): Filters => ({ statuses: [] })
|
|
24
|
+
|
|
25
|
+
function useFilterCopy() {
|
|
26
|
+
const t = useT()
|
|
27
|
+
return (key: string, values?: Record<string, string | number>) => t(\`design_system.gallery.examples.sourceFilters.\${key}\`, values)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function SourceFilterPanel({ value, onApply }: { value?: Filters; onApply?: (value: Filters) => void }) {
|
|
31
|
+
const copy = useFilterCopy()
|
|
32
|
+
const [draft, setDraft] = React.useState<Filters>(() => value ?? emptyFilters())
|
|
33
|
+
const [section, setSection] = React.useState('date')
|
|
34
|
+
const [applied, setApplied] = React.useState(false)
|
|
35
|
+
const panelId = React.useId()
|
|
36
|
+
function clear() { setDraft(emptyFilters()); setApplied(false) }
|
|
37
|
+
return <div className="w-full min-w-0 bg-background" data-example="filter-panel">
|
|
38
|
+
<div className="flex flex-col sm:flex-row">
|
|
39
|
+
<div className="flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r" role="group" aria-label={copy('categories')}>
|
|
40
|
+
<FilterPanelItem active={section === 'date'} leading={<CalendarDays />} aria-controls={panelId} onClick={() => setSection('date')}>{copy('date')}</FilterPanelItem>
|
|
41
|
+
<FilterPanelItem active={section === 'status'} leading={<Check />} aria-controls={panelId} onClick={() => setSection('status')}>{copy('status')}</FilterPanelItem>
|
|
42
|
+
</div>
|
|
43
|
+
<section id={panelId} aria-label={copy(section)} className="min-w-0 flex-1">
|
|
44
|
+
<FilterPanelHeader title={copy(section)} leading={section === 'date' ? <CalendarDays /> : <Check />} action={<Button variant="link" className="h-auto p-0 text-sm leading-5 text-muted-foreground" onClick={clear}>{copy('clear')}</Button>} />
|
|
45
|
+
<div className="flex min-h-80 justify-center px-5 pb-5">
|
|
46
|
+
{section === 'date'
|
|
47
|
+
? <Calendar mode="single" defaultMonth={draft.date ?? new Date(2023, 7, 1)} selected={draft.date} onSelect={date => { setDraft(previous => ({ ...previous, date })); setApplied(false) }} />
|
|
48
|
+
: <div className="w-full space-y-4 pt-2">{['completed', 'pending'].map(status => <CheckboxField key={status} label={copy(status)} checked={draft.statuses.includes(status)} onCheckedChange={checked => { setDraft(previous => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter(item => item !== status) })); setApplied(false) }} />)}</div>}
|
|
49
|
+
</div>
|
|
50
|
+
</section>
|
|
51
|
+
</div>
|
|
52
|
+
<FilterPanelFooter><Button variant="outline" onClick={clear}>{copy('clear')}</Button><Button variant="primary-filled" onClick={() => { onApply?.(draft); setApplied(true) }}>{copy('apply')}</Button></FilterPanelFooter>
|
|
53
|
+
{applied ? <p role="status" className="px-5 pb-4 text-sm text-muted-foreground">{copy('applied')}</p> : null}
|
|
54
|
+
</div>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function SourceFilterParts() {
|
|
58
|
+
const copy = useFilterCopy()
|
|
59
|
+
const [active, setActive] = React.useState(2)
|
|
60
|
+
const [notice, setNotice] = React.useState('')
|
|
61
|
+
return <div className="grid w-full gap-6">
|
|
62
|
+
<div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
|
|
63
|
+
{['Default', 'Hover', 'Active'].map((state, index) => <div key={state} className="w-[200px] max-w-full space-y-2">
|
|
64
|
+
<p className="text-xs text-muted-foreground">{state}</p>
|
|
65
|
+
<FilterPanelItem active={active === index} leading={<CalendarDays />} onClick={() => setActive(index)}>{copy('date')}</FilterPanelItem>
|
|
66
|
+
</div>)}
|
|
67
|
+
</div>
|
|
68
|
+
<div className="w-[400px] max-w-full rounded-md border border-border"><FilterPanelHeader title={copy('date')} leading={<CalendarDays />} action={<Button variant="link" className="h-auto p-0 text-sm leading-5 text-muted-foreground" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button>} /></div>
|
|
69
|
+
<div className="w-[472px] max-w-full"><FilterPanelFooter><Button variant="outline" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button><Button variant="primary-filled" onClick={() => setNotice(copy('applied'))}>{copy('apply')}</Button></FilterPanelFooter></div>
|
|
70
|
+
<p role="status" className="min-h-5 text-sm text-muted-foreground">{notice}</p>
|
|
71
|
+
</div>
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function SourceFilterToolbar({ type }: { type: 'table' | 'calendar' }) {
|
|
75
|
+
const copy = useFilterCopy()
|
|
76
|
+
const [query, setQuery] = React.useState('')
|
|
77
|
+
const [category, setCategory] = React.useState('all')
|
|
78
|
+
const [sort, setSort] = React.useState('recent')
|
|
79
|
+
const [period, setPeriod] = React.useState('7')
|
|
80
|
+
const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11))
|
|
81
|
+
const [filters, setFilters] = React.useState<Filters>(emptyFilters)
|
|
82
|
+
const [filterOpen, setFilterOpen] = React.useState(false)
|
|
83
|
+
const [showAmount, setShowAmount] = React.useState(true)
|
|
84
|
+
const [dateOpen, setDateOpen] = React.useState(false)
|
|
85
|
+
const periodStart = new Date(endDate)
|
|
86
|
+
periodStart.setDate(endDate.getDate() - Number(period))
|
|
87
|
+
const rows = transactionRows.filter(row => {
|
|
88
|
+
if (category !== 'all' && row.type !== category) return false
|
|
89
|
+
if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false
|
|
90
|
+
if (filters.statuses.length && !filters.statuses.includes(row.status)) return false
|
|
91
|
+
if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false
|
|
92
|
+
return type !== 'calendar' || (row.date >= periodStart && row.date <= endDate)
|
|
93
|
+
}).sort((a, b) => sort === 'amount' ? b.amount - a.amount : b.date.getTime() - a.date.getTime())
|
|
94
|
+
const dateText = \`\${periodStart.toLocaleDateString()} \u2013 \${endDate.toLocaleDateString()}\`
|
|
95
|
+
return <div className="w-full min-w-0 space-y-4" data-example={\`filter-toolbar-\${type}\`}>
|
|
96
|
+
<FilterToolbar className="max-w-[1104px]" leading={type === 'table'
|
|
97
|
+
? <SegmentedControl value={category} onValueChange={setCategory} aria-label={copy('transactionType')} className="h-9 w-80 max-w-full rounded-md border-0 p-1">
|
|
98
|
+
{['all', 'income', 'expense'].map(item => <SegmentedControlItem key={item} value={item} className="flex-1 rounded-sm">{copy(item)}</SegmentedControlItem>)}
|
|
99
|
+
</SegmentedControl>
|
|
100
|
+
: <><Button variant="outline" onClick={() => { setEndDate(new Date()); setPeriod('0') }}>{copy('today')}</Button>
|
|
101
|
+
<ButtonGroup size={36} aria-label={copy('dateRange')} className="max-w-full flex-wrap">
|
|
102
|
+
<Select value={period} onValueChange={setPeriod}><SelectTrigger className="w-auto" aria-label={copy('period')}><SelectValue /></SelectTrigger><SelectContent>{['0', '7', '30'].map(item => <SelectItem key={item} value={item}>{copy(\`period\${item}\`)}</SelectItem>)}</SelectContent></Select>
|
|
103
|
+
<Popover open={dateOpen} onOpenChange={setDateOpen}><PopoverTrigger asChild><Button variant="outline" aria-label={copy('dateRange')}><CalendarDays className="size-5" aria-hidden="true" /><span className="truncate">{dateText}</span></Button></PopoverTrigger><PopoverContent className="w-auto p-3" align="start"><Calendar mode="single" selected={endDate} defaultMonth={endDate} onSelect={date => { if (date) { setEndDate(date); setDateOpen(false) } }} /></PopoverContent></Popover>
|
|
104
|
+
</ButtonGroup></>}>
|
|
105
|
+
<SearchInput value={query} onChange={setQuery} aria-label={copy('search')} placeholder={copy('search')} className="w-[300px] max-w-full [&>svg]:size-5" />
|
|
106
|
+
<Popover open={filterOpen} onOpenChange={setFilterOpen}><PopoverTrigger asChild><Button variant="outline"><Filter className="size-5" aria-hidden="true" />{copy('filter')}</Button></PopoverTrigger>
|
|
107
|
+
<PopoverContent className="w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0" align="end"><SourceFilterPanel value={filters} onApply={value => { setFilters(value); setFilterOpen(false) }} /></PopoverContent>
|
|
108
|
+
</Popover>
|
|
109
|
+
<Popover><PopoverTrigger asChild><IconButton variant="outline" aria-label={copy('settings')}><Settings2 className="size-5" /></IconButton></PopoverTrigger><PopoverContent className="w-60"><CheckboxField checked={showAmount} onCheckedChange={checked => setShowAmount(checked === true)} label={copy('showAmount')} /></PopoverContent></Popover>
|
|
110
|
+
{type === 'table' ? <Select value={sort} onValueChange={setSort}><SelectTrigger className="w-40" aria-label={copy('sort')}><SelectValue /></SelectTrigger><SelectContent><SelectItem value="recent">{copy('recent')}</SelectItem><SelectItem value="amount">{copy('amount')}</SelectItem></SelectContent></Select> : null}
|
|
111
|
+
</FilterToolbar>
|
|
112
|
+
<p role="status" className="text-sm text-muted-foreground">{copy('results', { count: rows.length })}</p>
|
|
113
|
+
<div className="overflow-x-auto rounded-md border border-border"><Table className="min-w-[440px]">
|
|
114
|
+
<TableHeader><TableRow><TableHead>{copy('name')}</TableHead><TableHead>{copy('status')}</TableHead>{showAmount ? <TableHead className="text-right">{copy('amount')}</TableHead> : null}</TableRow></TableHeader>
|
|
115
|
+
<TableBody>{rows.map(row => <TableRow key={row.name}><TableCell className="font-medium">{row.name}</TableCell><TableCell>{copy(row.status)}</TableCell>{showAmount ? <TableCell className="text-right tabular-nums">{row.amount.toLocaleString(undefined, { style: 'currency', currency: 'USD' })}</TableCell> : null}</TableRow>)}</TableBody>
|
|
116
|
+
</Table></div>
|
|
117
|
+
<Button size="sm" variant="ghost" onClick={() => { setQuery(''); setCategory('all'); setFilters(emptyFilters()); setPeriod('7'); setEndDate(new Date(2023, 7, 11)); setSort('recent'); setShowAmount(true) }}>{copy('reset')}</Button>
|
|
118
|
+
</div>
|
|
119
|
+
}
|
|
120
|
+
`;
|
|
121
|
+
const sourceFilterExampleCode = (expression) => source + "\n" + expression + "\n";
|
|
122
|
+
export {
|
|
123
|
+
sourceFilterExampleCode
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=source-filters-code.generated.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/demos/source-filters-code.generated.ts"],
|
|
4
|
+
"sourcesContent": ["// Generated by yarn storybook:generate from source-filters.tsx.\nconst source = \"import * as React from 'react'\\nimport { CalendarDays, Check, Filter, Settings2 } from 'lucide-react'\\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\\nimport { Button } from '@open-mercato/ui/primitives/button'\\nimport { ButtonGroup } from '@open-mercato/ui/primitives/button-group'\\nimport { Calendar } from '@open-mercato/ui/primitives/calendar'\\nimport { CheckboxField } from '@open-mercato/ui/primitives/checkbox-field'\\nimport { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from '@open-mercato/ui/primitives/filter-toolbar'\\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@open-mercato/ui/primitives/table'\\n\\ntype Filters = { date?: Date; statuses: string[] }\\nconst transactionRows = [\\n { name: 'Apex', type: 'income', date: new Date(2023, 7, 11), amount: 1240, status: 'completed' },\\n { name: 'Spotify', type: 'expense', date: new Date(2023, 7, 10), amount: -12, status: 'completed' },\\n { name: 'Synergy', type: 'income', date: new Date(2023, 7, 9), amount: 680, status: 'pending' },\\n { name: 'Loom', type: 'expense', date: new Date(2023, 7, 11), amount: -18, status: 'pending' },\\n]\\nconst emptyFilters = (): Filters => ({ statuses: [] })\\n\\nfunction useFilterCopy() {\\n const t = useT()\\n return (key: string, values?: Record<string, string | number>) => t(`design_system.gallery.examples.sourceFilters.${key}`, values)\\n}\\n\\nexport function SourceFilterPanel({ value, onApply }: { value?: Filters; onApply?: (value: Filters) => void }) {\\n const copy = useFilterCopy()\\n const [draft, setDraft] = React.useState<Filters>(() => value ?? emptyFilters())\\n const [section, setSection] = React.useState('date')\\n const [applied, setApplied] = React.useState(false)\\n const panelId = React.useId()\\n function clear() { setDraft(emptyFilters()); setApplied(false) }\\n return <div className=\\\"w-full min-w-0 bg-background\\\" data-example=\\\"filter-panel\\\">\\n <div className=\\\"flex flex-col sm:flex-row\\\">\\n <div className=\\\"flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r\\\" role=\\\"group\\\" aria-label={copy('categories')}>\\n <FilterPanelItem active={section === 'date'} leading={<CalendarDays />} aria-controls={panelId} onClick={() => setSection('date')}>{copy('date')}</FilterPanelItem>\\n <FilterPanelItem active={section === 'status'} leading={<Check />} aria-controls={panelId} onClick={() => setSection('status')}>{copy('status')}</FilterPanelItem>\\n </div>\\n <section id={panelId} aria-label={copy(section)} className=\\\"min-w-0 flex-1\\\">\\n <FilterPanelHeader title={copy(section)} leading={section === 'date' ? <CalendarDays /> : <Check />} action={<Button variant=\\\"link\\\" className=\\\"h-auto p-0 text-sm leading-5 text-muted-foreground\\\" onClick={clear}>{copy('clear')}</Button>} />\\n <div className=\\\"flex min-h-80 justify-center px-5 pb-5\\\">\\n {section === 'date'\\n ? <Calendar mode=\\\"single\\\" defaultMonth={draft.date ?? new Date(2023, 7, 1)} selected={draft.date} onSelect={date => { setDraft(previous => ({ ...previous, date })); setApplied(false) }} />\\n : <div className=\\\"w-full space-y-4 pt-2\\\">{['completed', 'pending'].map(status => <CheckboxField key={status} label={copy(status)} checked={draft.statuses.includes(status)} onCheckedChange={checked => { setDraft(previous => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter(item => item !== status) })); setApplied(false) }} />)}</div>}\\n </div>\\n </section>\\n </div>\\n <FilterPanelFooter><Button variant=\\\"outline\\\" onClick={clear}>{copy('clear')}</Button><Button variant=\\\"primary-filled\\\" onClick={() => { onApply?.(draft); setApplied(true) }}>{copy('apply')}</Button></FilterPanelFooter>\\n {applied ? <p role=\\\"status\\\" className=\\\"px-5 pb-4 text-sm text-muted-foreground\\\">{copy('applied')}</p> : null}\\n </div>\\n}\\n\\nexport function SourceFilterParts() {\\n const copy = useFilterCopy()\\n const [active, setActive] = React.useState(2)\\n const [notice, setNotice] = React.useState('')\\n return <div className=\\\"grid w-full gap-6\\\">\\n <div className=\\\"grid grid-cols-1 gap-4 sm:grid-cols-3\\\">\\n {['Default', 'Hover', 'Active'].map((state, index) => <div key={state} className=\\\"w-[200px] max-w-full space-y-2\\\">\\n <p className=\\\"text-xs text-muted-foreground\\\">{state}</p>\\n <FilterPanelItem active={active === index} leading={<CalendarDays />} onClick={() => setActive(index)}>{copy('date')}</FilterPanelItem>\\n </div>)}\\n </div>\\n <div className=\\\"w-[400px] max-w-full rounded-md border border-border\\\"><FilterPanelHeader title={copy('date')} leading={<CalendarDays />} action={<Button variant=\\\"link\\\" className=\\\"h-auto p-0 text-sm leading-5 text-muted-foreground\\\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button>} /></div>\\n <div className=\\\"w-[472px] max-w-full\\\"><FilterPanelFooter><Button variant=\\\"outline\\\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button><Button variant=\\\"primary-filled\\\" onClick={() => setNotice(copy('applied'))}>{copy('apply')}</Button></FilterPanelFooter></div>\\n <p role=\\\"status\\\" className=\\\"min-h-5 text-sm text-muted-foreground\\\">{notice}</p>\\n </div>\\n}\\n\\nexport function SourceFilterToolbar({ type }: { type: 'table' | 'calendar' }) {\\n const copy = useFilterCopy()\\n const [query, setQuery] = React.useState('')\\n const [category, setCategory] = React.useState('all')\\n const [sort, setSort] = React.useState('recent')\\n const [period, setPeriod] = React.useState('7')\\n const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11))\\n const [filters, setFilters] = React.useState<Filters>(emptyFilters)\\n const [filterOpen, setFilterOpen] = React.useState(false)\\n const [showAmount, setShowAmount] = React.useState(true)\\n const [dateOpen, setDateOpen] = React.useState(false)\\n const periodStart = new Date(endDate)\\n periodStart.setDate(endDate.getDate() - Number(period))\\n const rows = transactionRows.filter(row => {\\n if (category !== 'all' && row.type !== category) return false\\n if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false\\n if (filters.statuses.length && !filters.statuses.includes(row.status)) return false\\n if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false\\n return type !== 'calendar' || (row.date >= periodStart && row.date <= endDate)\\n }).sort((a, b) => sort === 'amount' ? b.amount - a.amount : b.date.getTime() - a.date.getTime())\\n const dateText = `${periodStart.toLocaleDateString()} \u2013 ${endDate.toLocaleDateString()}`\\n return <div className=\\\"w-full min-w-0 space-y-4\\\" data-example={`filter-toolbar-${type}`}>\\n <FilterToolbar className=\\\"max-w-[1104px]\\\" leading={type === 'table'\\n ? <SegmentedControl value={category} onValueChange={setCategory} aria-label={copy('transactionType')} className=\\\"h-9 w-80 max-w-full rounded-md border-0 p-1\\\">\\n {['all', 'income', 'expense'].map(item => <SegmentedControlItem key={item} value={item} className=\\\"flex-1 rounded-sm\\\">{copy(item)}</SegmentedControlItem>)}\\n </SegmentedControl>\\n : <><Button variant=\\\"outline\\\" onClick={() => { setEndDate(new Date()); setPeriod('0') }}>{copy('today')}</Button>\\n <ButtonGroup size={36} aria-label={copy('dateRange')} className=\\\"max-w-full flex-wrap\\\">\\n <Select value={period} onValueChange={setPeriod}><SelectTrigger className=\\\"w-auto\\\" aria-label={copy('period')}><SelectValue /></SelectTrigger><SelectContent>{['0', '7', '30'].map(item => <SelectItem key={item} value={item}>{copy(`period${item}`)}</SelectItem>)}</SelectContent></Select>\\n <Popover open={dateOpen} onOpenChange={setDateOpen}><PopoverTrigger asChild><Button variant=\\\"outline\\\" aria-label={copy('dateRange')}><CalendarDays className=\\\"size-5\\\" aria-hidden=\\\"true\\\" /><span className=\\\"truncate\\\">{dateText}</span></Button></PopoverTrigger><PopoverContent className=\\\"w-auto p-3\\\" align=\\\"start\\\"><Calendar mode=\\\"single\\\" selected={endDate} defaultMonth={endDate} onSelect={date => { if (date) { setEndDate(date); setDateOpen(false) } }} /></PopoverContent></Popover>\\n </ButtonGroup></>}>\\n <SearchInput value={query} onChange={setQuery} aria-label={copy('search')} placeholder={copy('search')} className=\\\"w-[300px] max-w-full [&>svg]:size-5\\\" />\\n <Popover open={filterOpen} onOpenChange={setFilterOpen}><PopoverTrigger asChild><Button variant=\\\"outline\\\"><Filter className=\\\"size-5\\\" aria-hidden=\\\"true\\\" />{copy('filter')}</Button></PopoverTrigger>\\n <PopoverContent className=\\\"w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0\\\" align=\\\"end\\\"><SourceFilterPanel value={filters} onApply={value => { setFilters(value); setFilterOpen(false) }} /></PopoverContent>\\n </Popover>\\n <Popover><PopoverTrigger asChild><IconButton variant=\\\"outline\\\" aria-label={copy('settings')}><Settings2 className=\\\"size-5\\\" /></IconButton></PopoverTrigger><PopoverContent className=\\\"w-60\\\"><CheckboxField checked={showAmount} onCheckedChange={checked => setShowAmount(checked === true)} label={copy('showAmount')} /></PopoverContent></Popover>\\n {type === 'table' ? <Select value={sort} onValueChange={setSort}><SelectTrigger className=\\\"w-40\\\" aria-label={copy('sort')}><SelectValue /></SelectTrigger><SelectContent><SelectItem value=\\\"recent\\\">{copy('recent')}</SelectItem><SelectItem value=\\\"amount\\\">{copy('amount')}</SelectItem></SelectContent></Select> : null}\\n </FilterToolbar>\\n <p role=\\\"status\\\" className=\\\"text-sm text-muted-foreground\\\">{copy('results', { count: rows.length })}</p>\\n <div className=\\\"overflow-x-auto rounded-md border border-border\\\"><Table className=\\\"min-w-[440px]\\\">\\n <TableHeader><TableRow><TableHead>{copy('name')}</TableHead><TableHead>{copy('status')}</TableHead>{showAmount ? <TableHead className=\\\"text-right\\\">{copy('amount')}</TableHead> : null}</TableRow></TableHeader>\\n <TableBody>{rows.map(row => <TableRow key={row.name}><TableCell className=\\\"font-medium\\\">{row.name}</TableCell><TableCell>{copy(row.status)}</TableCell>{showAmount ? <TableCell className=\\\"text-right tabular-nums\\\">{row.amount.toLocaleString(undefined, { style: 'currency', currency: 'USD' })}</TableCell> : null}</TableRow>)}</TableBody>\\n </Table></div>\\n <Button size=\\\"sm\\\" variant=\\\"ghost\\\" onClick={() => { setQuery(''); setCategory('all'); setFilters(emptyFilters()); setPeriod('7'); setEndDate(new Date(2023, 7, 11)); setSort('recent'); setShowAmount(true) }}>{copy('reset')}</Button>\\n </div>\\n}\\n\"\nexport const sourceFilterExampleCode = (expression: string) => source + \"\\n\" + expression + \"\\n\"\n"],
|
|
5
|
+
"mappings": "AACA,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACR,MAAM,0BAA0B,CAAC,eAAuB,SAAS,OAAO,aAAa;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { CalendarDays, Check, Filter, Settings2 } from "lucide-react";
|
|
4
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
5
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
|
+
import { ButtonGroup } from "@open-mercato/ui/primitives/button-group";
|
|
7
|
+
import { Calendar } from "@open-mercato/ui/primitives/calendar";
|
|
8
|
+
import { CheckboxField } from "@open-mercato/ui/primitives/checkbox-field";
|
|
9
|
+
import { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from "@open-mercato/ui/primitives/filter-toolbar";
|
|
10
|
+
import { IconButton } from "@open-mercato/ui/primitives/icon-button";
|
|
11
|
+
import { Popover, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
|
|
12
|
+
import { SearchInput } from "@open-mercato/ui/primitives/search-input";
|
|
13
|
+
import { SegmentedControl, SegmentedControlItem } from "@open-mercato/ui/primitives/segmented-control";
|
|
14
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@open-mercato/ui/primitives/select";
|
|
15
|
+
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@open-mercato/ui/primitives/table";
|
|
16
|
+
const transactionRows = [
|
|
17
|
+
{ name: "Apex", type: "income", date: new Date(2023, 7, 11), amount: 1240, status: "completed" },
|
|
18
|
+
{ name: "Spotify", type: "expense", date: new Date(2023, 7, 10), amount: -12, status: "completed" },
|
|
19
|
+
{ name: "Synergy", type: "income", date: new Date(2023, 7, 9), amount: 680, status: "pending" },
|
|
20
|
+
{ name: "Loom", type: "expense", date: new Date(2023, 7, 11), amount: -18, status: "pending" }
|
|
21
|
+
];
|
|
22
|
+
const emptyFilters = () => ({ statuses: [] });
|
|
23
|
+
function useFilterCopy() {
|
|
24
|
+
const t = useT();
|
|
25
|
+
return (key, values) => t(`design_system.gallery.examples.sourceFilters.${key}`, values);
|
|
26
|
+
}
|
|
27
|
+
function SourceFilterPanel({ value, onApply }) {
|
|
28
|
+
const copy = useFilterCopy();
|
|
29
|
+
const [draft, setDraft] = React.useState(() => value ?? emptyFilters());
|
|
30
|
+
const [section, setSection] = React.useState("date");
|
|
31
|
+
const [applied, setApplied] = React.useState(false);
|
|
32
|
+
const panelId = React.useId();
|
|
33
|
+
function clear() {
|
|
34
|
+
setDraft(emptyFilters());
|
|
35
|
+
setApplied(false);
|
|
36
|
+
}
|
|
37
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 bg-background", "data-example": "filter-panel", children: [
|
|
38
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row", children: [
|
|
39
|
+
/* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r", role: "group", "aria-label": copy("categories"), children: [
|
|
40
|
+
/* @__PURE__ */ jsx(FilterPanelItem, { active: section === "date", leading: /* @__PURE__ */ jsx(CalendarDays, {}), "aria-controls": panelId, onClick: () => setSection("date"), children: copy("date") }),
|
|
41
|
+
/* @__PURE__ */ jsx(FilterPanelItem, { active: section === "status", leading: /* @__PURE__ */ jsx(Check, {}), "aria-controls": panelId, onClick: () => setSection("status"), children: copy("status") })
|
|
42
|
+
] }),
|
|
43
|
+
/* @__PURE__ */ jsxs("section", { id: panelId, "aria-label": copy(section), className: "min-w-0 flex-1", children: [
|
|
44
|
+
/* @__PURE__ */ jsx(FilterPanelHeader, { title: copy(section), leading: section === "date" ? /* @__PURE__ */ jsx(CalendarDays, {}) : /* @__PURE__ */ jsx(Check, {}), action: /* @__PURE__ */ jsx(Button, { variant: "link", className: "h-auto p-0 text-sm leading-5 text-muted-foreground", onClick: clear, children: copy("clear") }) }),
|
|
45
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-h-80 justify-center px-5 pb-5", children: section === "date" ? /* @__PURE__ */ jsx(Calendar, { mode: "single", defaultMonth: draft.date ?? new Date(2023, 7, 1), selected: draft.date, onSelect: (date) => {
|
|
46
|
+
setDraft((previous) => ({ ...previous, date }));
|
|
47
|
+
setApplied(false);
|
|
48
|
+
} }) : /* @__PURE__ */ jsx("div", { className: "w-full space-y-4 pt-2", children: ["completed", "pending"].map((status) => /* @__PURE__ */ jsx(CheckboxField, { label: copy(status), checked: draft.statuses.includes(status), onCheckedChange: (checked) => {
|
|
49
|
+
setDraft((previous) => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter((item) => item !== status) }));
|
|
50
|
+
setApplied(false);
|
|
51
|
+
} }, status)) }) })
|
|
52
|
+
] })
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsxs(FilterPanelFooter, { children: [
|
|
55
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: clear, children: copy("clear") }),
|
|
56
|
+
/* @__PURE__ */ jsx(Button, { variant: "primary-filled", onClick: () => {
|
|
57
|
+
onApply?.(draft);
|
|
58
|
+
setApplied(true);
|
|
59
|
+
}, children: copy("apply") })
|
|
60
|
+
] }),
|
|
61
|
+
applied ? /* @__PURE__ */ jsx("p", { role: "status", className: "px-5 pb-4 text-sm text-muted-foreground", children: copy("applied") }) : null
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
function SourceFilterParts() {
|
|
65
|
+
const copy = useFilterCopy();
|
|
66
|
+
const [active, setActive] = React.useState(2);
|
|
67
|
+
const [notice, setNotice] = React.useState("");
|
|
68
|
+
return /* @__PURE__ */ jsxs("div", { className: "grid w-full gap-6", children: [
|
|
69
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-3", children: ["Default", "Hover", "Active"].map((state, index) => /* @__PURE__ */ jsxs("div", { className: "w-[200px] max-w-full space-y-2", children: [
|
|
70
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: state }),
|
|
71
|
+
/* @__PURE__ */ jsx(FilterPanelItem, { active: active === index, leading: /* @__PURE__ */ jsx(CalendarDays, {}), onClick: () => setActive(index), children: copy("date") })
|
|
72
|
+
] }, state)) }),
|
|
73
|
+
/* @__PURE__ */ jsx("div", { className: "w-[400px] max-w-full rounded-md border border-border", children: /* @__PURE__ */ jsx(FilterPanelHeader, { title: copy("date"), leading: /* @__PURE__ */ jsx(CalendarDays, {}), action: /* @__PURE__ */ jsx(Button, { variant: "link", className: "h-auto p-0 text-sm leading-5 text-muted-foreground", onClick: () => {
|
|
74
|
+
setActive(-1);
|
|
75
|
+
setNotice(copy("cleared"));
|
|
76
|
+
}, children: copy("clear") }) }) }),
|
|
77
|
+
/* @__PURE__ */ jsx("div", { className: "w-[472px] max-w-full", children: /* @__PURE__ */ jsxs(FilterPanelFooter, { children: [
|
|
78
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => {
|
|
79
|
+
setActive(-1);
|
|
80
|
+
setNotice(copy("cleared"));
|
|
81
|
+
}, children: copy("clear") }),
|
|
82
|
+
/* @__PURE__ */ jsx(Button, { variant: "primary-filled", onClick: () => setNotice(copy("applied")), children: copy("apply") })
|
|
83
|
+
] }) }),
|
|
84
|
+
/* @__PURE__ */ jsx("p", { role: "status", className: "min-h-5 text-sm text-muted-foreground", children: notice })
|
|
85
|
+
] });
|
|
86
|
+
}
|
|
87
|
+
function SourceFilterToolbar({ type }) {
|
|
88
|
+
const copy = useFilterCopy();
|
|
89
|
+
const [query, setQuery] = React.useState("");
|
|
90
|
+
const [category, setCategory] = React.useState("all");
|
|
91
|
+
const [sort, setSort] = React.useState("recent");
|
|
92
|
+
const [period, setPeriod] = React.useState("7");
|
|
93
|
+
const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11));
|
|
94
|
+
const [filters, setFilters] = React.useState(emptyFilters);
|
|
95
|
+
const [filterOpen, setFilterOpen] = React.useState(false);
|
|
96
|
+
const [showAmount, setShowAmount] = React.useState(true);
|
|
97
|
+
const [dateOpen, setDateOpen] = React.useState(false);
|
|
98
|
+
const periodStart = new Date(endDate);
|
|
99
|
+
periodStart.setDate(endDate.getDate() - Number(period));
|
|
100
|
+
const rows = transactionRows.filter((row) => {
|
|
101
|
+
if (category !== "all" && row.type !== category) return false;
|
|
102
|
+
if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false;
|
|
103
|
+
if (filters.statuses.length && !filters.statuses.includes(row.status)) return false;
|
|
104
|
+
if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false;
|
|
105
|
+
return type !== "calendar" || row.date >= periodStart && row.date <= endDate;
|
|
106
|
+
}).sort((a, b) => sort === "amount" ? b.amount - a.amount : b.date.getTime() - a.date.getTime());
|
|
107
|
+
const dateText = `${periodStart.toLocaleDateString()} \u2013 ${endDate.toLocaleDateString()}`;
|
|
108
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-4", "data-example": `filter-toolbar-${type}`, children: [
|
|
109
|
+
/* @__PURE__ */ jsxs(FilterToolbar, { className: "max-w-[1104px]", leading: type === "table" ? /* @__PURE__ */ jsx(SegmentedControl, { value: category, onValueChange: setCategory, "aria-label": copy("transactionType"), className: "h-9 w-80 max-w-full rounded-md border-0 p-1", children: ["all", "income", "expense"].map((item) => /* @__PURE__ */ jsx(SegmentedControlItem, { value: item, className: "flex-1 rounded-sm", children: copy(item) }, item)) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
110
|
+
/* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => {
|
|
111
|
+
setEndDate(/* @__PURE__ */ new Date());
|
|
112
|
+
setPeriod("0");
|
|
113
|
+
}, children: copy("today") }),
|
|
114
|
+
/* @__PURE__ */ jsxs(ButtonGroup, { size: 36, "aria-label": copy("dateRange"), className: "max-w-full flex-wrap", children: [
|
|
115
|
+
/* @__PURE__ */ jsxs(Select, { value: period, onValueChange: setPeriod, children: [
|
|
116
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-auto", "aria-label": copy("period"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
117
|
+
/* @__PURE__ */ jsx(SelectContent, { children: ["0", "7", "30"].map((item) => /* @__PURE__ */ jsx(SelectItem, { value: item, children: copy(`period${item}`) }, item)) })
|
|
118
|
+
] }),
|
|
119
|
+
/* @__PURE__ */ jsxs(Popover, { open: dateOpen, onOpenChange: setDateOpen, children: [
|
|
120
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", "aria-label": copy("dateRange"), children: [
|
|
121
|
+
/* @__PURE__ */ jsx(CalendarDays, { className: "size-5", "aria-hidden": "true" }),
|
|
122
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: dateText })
|
|
123
|
+
] }) }),
|
|
124
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-3", align: "start", children: /* @__PURE__ */ jsx(Calendar, { mode: "single", selected: endDate, defaultMonth: endDate, onSelect: (date) => {
|
|
125
|
+
if (date) {
|
|
126
|
+
setEndDate(date);
|
|
127
|
+
setDateOpen(false);
|
|
128
|
+
}
|
|
129
|
+
} }) })
|
|
130
|
+
] })
|
|
131
|
+
] })
|
|
132
|
+
] }), children: [
|
|
133
|
+
/* @__PURE__ */ jsx(SearchInput, { value: query, onChange: setQuery, "aria-label": copy("search"), placeholder: copy("search"), className: "w-[300px] max-w-full [&>svg]:size-5" }),
|
|
134
|
+
/* @__PURE__ */ jsxs(Popover, { open: filterOpen, onOpenChange: setFilterOpen, children: [
|
|
135
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", children: [
|
|
136
|
+
/* @__PURE__ */ jsx(Filter, { className: "size-5", "aria-hidden": "true" }),
|
|
137
|
+
copy("filter")
|
|
138
|
+
] }) }),
|
|
139
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0", align: "end", children: /* @__PURE__ */ jsx(SourceFilterPanel, { value: filters, onApply: (value) => {
|
|
140
|
+
setFilters(value);
|
|
141
|
+
setFilterOpen(false);
|
|
142
|
+
} }) })
|
|
143
|
+
] }),
|
|
144
|
+
/* @__PURE__ */ jsxs(Popover, { children: [
|
|
145
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { variant: "outline", "aria-label": copy("settings"), children: /* @__PURE__ */ jsx(Settings2, { className: "size-5" }) }) }),
|
|
146
|
+
/* @__PURE__ */ jsx(PopoverContent, { className: "w-60", children: /* @__PURE__ */ jsx(CheckboxField, { checked: showAmount, onCheckedChange: (checked) => setShowAmount(checked === true), label: copy("showAmount") }) })
|
|
147
|
+
] }),
|
|
148
|
+
type === "table" ? /* @__PURE__ */ jsxs(Select, { value: sort, onValueChange: setSort, children: [
|
|
149
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-40", "aria-label": copy("sort"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
150
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
151
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "recent", children: copy("recent") }),
|
|
152
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "amount", children: copy("amount") })
|
|
153
|
+
] })
|
|
154
|
+
] }) : null
|
|
155
|
+
] }),
|
|
156
|
+
/* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-muted-foreground", children: copy("results", { count: rows.length }) }),
|
|
157
|
+
/* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-md border border-border", children: /* @__PURE__ */ jsxs(Table, { className: "min-w-[440px]", children: [
|
|
158
|
+
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
159
|
+
/* @__PURE__ */ jsx(TableHead, { children: copy("name") }),
|
|
160
|
+
/* @__PURE__ */ jsx(TableHead, { children: copy("status") }),
|
|
161
|
+
showAmount ? /* @__PURE__ */ jsx(TableHead, { className: "text-right", children: copy("amount") }) : null
|
|
162
|
+
] }) }),
|
|
163
|
+
/* @__PURE__ */ jsx(TableBody, { children: rows.map((row) => /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
164
|
+
/* @__PURE__ */ jsx(TableCell, { className: "font-medium", children: row.name }),
|
|
165
|
+
/* @__PURE__ */ jsx(TableCell, { children: copy(row.status) }),
|
|
166
|
+
showAmount ? /* @__PURE__ */ jsx(TableCell, { className: "text-right tabular-nums", children: row.amount.toLocaleString(void 0, { style: "currency", currency: "USD" }) }) : null
|
|
167
|
+
] }, row.name)) })
|
|
168
|
+
] }) }),
|
|
169
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: () => {
|
|
170
|
+
setQuery("");
|
|
171
|
+
setCategory("all");
|
|
172
|
+
setFilters(emptyFilters());
|
|
173
|
+
setPeriod("7");
|
|
174
|
+
setEndDate(new Date(2023, 7, 11));
|
|
175
|
+
setSort("recent");
|
|
176
|
+
setShowAmount(true);
|
|
177
|
+
}, children: copy("reset") })
|
|
178
|
+
] });
|
|
179
|
+
}
|
|
180
|
+
export {
|
|
181
|
+
SourceFilterPanel,
|
|
182
|
+
SourceFilterParts,
|
|
183
|
+
SourceFilterToolbar
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=source-filters.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/demos/source-filters.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { CalendarDays, Check, Filter, Settings2 } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ButtonGroup } from '@open-mercato/ui/primitives/button-group'\nimport { Calendar } from '@open-mercato/ui/primitives/calendar'\nimport { CheckboxField } from '@open-mercato/ui/primitives/checkbox-field'\nimport { FilterToolbar, FilterPanelItem, FilterPanelHeader, FilterPanelFooter } from '@open-mercato/ui/primitives/filter-toolbar'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@open-mercato/ui/primitives/table'\n\ntype Filters = { date?: Date; statuses: string[] }\nconst transactionRows = [\n { name: 'Apex', type: 'income', date: new Date(2023, 7, 11), amount: 1240, status: 'completed' },\n { name: 'Spotify', type: 'expense', date: new Date(2023, 7, 10), amount: -12, status: 'completed' },\n { name: 'Synergy', type: 'income', date: new Date(2023, 7, 9), amount: 680, status: 'pending' },\n { name: 'Loom', type: 'expense', date: new Date(2023, 7, 11), amount: -18, status: 'pending' },\n]\nconst emptyFilters = (): Filters => ({ statuses: [] })\n\nfunction useFilterCopy() {\n const t = useT()\n return (key: string, values?: Record<string, string | number>) => t(`design_system.gallery.examples.sourceFilters.${key}`, values)\n}\n\nexport function SourceFilterPanel({ value, onApply }: { value?: Filters; onApply?: (value: Filters) => void }) {\n const copy = useFilterCopy()\n const [draft, setDraft] = React.useState<Filters>(() => value ?? emptyFilters())\n const [section, setSection] = React.useState('date')\n const [applied, setApplied] = React.useState(false)\n const panelId = React.useId()\n function clear() { setDraft(emptyFilters()); setApplied(false) }\n return <div className=\"w-full min-w-0 bg-background\" data-example=\"filter-panel\">\n <div className=\"flex flex-col sm:flex-row\">\n <div className=\"flex shrink-0 flex-wrap gap-1 border-b border-border p-3 sm:w-[224px] sm:flex-col sm:border-b-0 sm:border-r\" role=\"group\" aria-label={copy('categories')}>\n <FilterPanelItem active={section === 'date'} leading={<CalendarDays />} aria-controls={panelId} onClick={() => setSection('date')}>{copy('date')}</FilterPanelItem>\n <FilterPanelItem active={section === 'status'} leading={<Check />} aria-controls={panelId} onClick={() => setSection('status')}>{copy('status')}</FilterPanelItem>\n </div>\n <section id={panelId} aria-label={copy(section)} className=\"min-w-0 flex-1\">\n <FilterPanelHeader title={copy(section)} leading={section === 'date' ? <CalendarDays /> : <Check />} action={<Button variant=\"link\" className=\"h-auto p-0 text-sm leading-5 text-muted-foreground\" onClick={clear}>{copy('clear')}</Button>} />\n <div className=\"flex min-h-80 justify-center px-5 pb-5\">\n {section === 'date'\n ? <Calendar mode=\"single\" defaultMonth={draft.date ?? new Date(2023, 7, 1)} selected={draft.date} onSelect={date => { setDraft(previous => ({ ...previous, date })); setApplied(false) }} />\n : <div className=\"w-full space-y-4 pt-2\">{['completed', 'pending'].map(status => <CheckboxField key={status} label={copy(status)} checked={draft.statuses.includes(status)} onCheckedChange={checked => { setDraft(previous => ({ ...previous, statuses: checked ? [...previous.statuses, status] : previous.statuses.filter(item => item !== status) })); setApplied(false) }} />)}</div>}\n </div>\n </section>\n </div>\n <FilterPanelFooter><Button variant=\"outline\" onClick={clear}>{copy('clear')}</Button><Button variant=\"primary-filled\" onClick={() => { onApply?.(draft); setApplied(true) }}>{copy('apply')}</Button></FilterPanelFooter>\n {applied ? <p role=\"status\" className=\"px-5 pb-4 text-sm text-muted-foreground\">{copy('applied')}</p> : null}\n </div>\n}\n\nexport function SourceFilterParts() {\n const copy = useFilterCopy()\n const [active, setActive] = React.useState(2)\n const [notice, setNotice] = React.useState('')\n return <div className=\"grid w-full gap-6\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n {['Default', 'Hover', 'Active'].map((state, index) => <div key={state} className=\"w-[200px] max-w-full space-y-2\">\n <p className=\"text-xs text-muted-foreground\">{state}</p>\n <FilterPanelItem active={active === index} leading={<CalendarDays />} onClick={() => setActive(index)}>{copy('date')}</FilterPanelItem>\n </div>)}\n </div>\n <div className=\"w-[400px] max-w-full rounded-md border border-border\"><FilterPanelHeader title={copy('date')} leading={<CalendarDays />} action={<Button variant=\"link\" className=\"h-auto p-0 text-sm leading-5 text-muted-foreground\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button>} /></div>\n <div className=\"w-[472px] max-w-full\"><FilterPanelFooter><Button variant=\"outline\" onClick={() => { setActive(-1); setNotice(copy('cleared')) }}>{copy('clear')}</Button><Button variant=\"primary-filled\" onClick={() => setNotice(copy('applied'))}>{copy('apply')}</Button></FilterPanelFooter></div>\n <p role=\"status\" className=\"min-h-5 text-sm text-muted-foreground\">{notice}</p>\n </div>\n}\n\nexport function SourceFilterToolbar({ type }: { type: 'table' | 'calendar' }) {\n const copy = useFilterCopy()\n const [query, setQuery] = React.useState('')\n const [category, setCategory] = React.useState('all')\n const [sort, setSort] = React.useState('recent')\n const [period, setPeriod] = React.useState('7')\n const [endDate, setEndDate] = React.useState(new Date(2023, 7, 11))\n const [filters, setFilters] = React.useState<Filters>(emptyFilters)\n const [filterOpen, setFilterOpen] = React.useState(false)\n const [showAmount, setShowAmount] = React.useState(true)\n const [dateOpen, setDateOpen] = React.useState(false)\n const periodStart = new Date(endDate)\n periodStart.setDate(endDate.getDate() - Number(period))\n const rows = transactionRows.filter(row => {\n if (category !== 'all' && row.type !== category) return false\n if (query && !row.name.toLowerCase().includes(query.trim().toLowerCase())) return false\n if (filters.statuses.length && !filters.statuses.includes(row.status)) return false\n if (filters.date && row.date.toDateString() !== filters.date.toDateString()) return false\n return type !== 'calendar' || (row.date >= periodStart && row.date <= endDate)\n }).sort((a, b) => sort === 'amount' ? b.amount - a.amount : b.date.getTime() - a.date.getTime())\n const dateText = `${periodStart.toLocaleDateString()} \u2013 ${endDate.toLocaleDateString()}`\n return <div className=\"w-full min-w-0 space-y-4\" data-example={`filter-toolbar-${type}`}>\n <FilterToolbar className=\"max-w-[1104px]\" leading={type === 'table'\n ? <SegmentedControl value={category} onValueChange={setCategory} aria-label={copy('transactionType')} className=\"h-9 w-80 max-w-full rounded-md border-0 p-1\">\n {['all', 'income', 'expense'].map(item => <SegmentedControlItem key={item} value={item} className=\"flex-1 rounded-sm\">{copy(item)}</SegmentedControlItem>)}\n </SegmentedControl>\n : <><Button variant=\"outline\" onClick={() => { setEndDate(new Date()); setPeriod('0') }}>{copy('today')}</Button>\n <ButtonGroup size={36} aria-label={copy('dateRange')} className=\"max-w-full flex-wrap\">\n <Select value={period} onValueChange={setPeriod}><SelectTrigger className=\"w-auto\" aria-label={copy('period')}><SelectValue /></SelectTrigger><SelectContent>{['0', '7', '30'].map(item => <SelectItem key={item} value={item}>{copy(`period${item}`)}</SelectItem>)}</SelectContent></Select>\n <Popover open={dateOpen} onOpenChange={setDateOpen}><PopoverTrigger asChild><Button variant=\"outline\" aria-label={copy('dateRange')}><CalendarDays className=\"size-5\" aria-hidden=\"true\" /><span className=\"truncate\">{dateText}</span></Button></PopoverTrigger><PopoverContent className=\"w-auto p-3\" align=\"start\"><Calendar mode=\"single\" selected={endDate} defaultMonth={endDate} onSelect={date => { if (date) { setEndDate(date); setDateOpen(false) } }} /></PopoverContent></Popover>\n </ButtonGroup></>}>\n <SearchInput value={query} onChange={setQuery} aria-label={copy('search')} placeholder={copy('search')} className=\"w-[300px] max-w-full [&>svg]:size-5\" />\n <Popover open={filterOpen} onOpenChange={setFilterOpen}><PopoverTrigger asChild><Button variant=\"outline\"><Filter className=\"size-5\" aria-hidden=\"true\" />{copy('filter')}</Button></PopoverTrigger>\n <PopoverContent className=\"w-[640px] max-w-[calc(100vw-24px)] overflow-hidden p-0\" align=\"end\"><SourceFilterPanel value={filters} onApply={value => { setFilters(value); setFilterOpen(false) }} /></PopoverContent>\n </Popover>\n <Popover><PopoverTrigger asChild><IconButton variant=\"outline\" aria-label={copy('settings')}><Settings2 className=\"size-5\" /></IconButton></PopoverTrigger><PopoverContent className=\"w-60\"><CheckboxField checked={showAmount} onCheckedChange={checked => setShowAmount(checked === true)} label={copy('showAmount')} /></PopoverContent></Popover>\n {type === 'table' ? <Select value={sort} onValueChange={setSort}><SelectTrigger className=\"w-40\" aria-label={copy('sort')}><SelectValue /></SelectTrigger><SelectContent><SelectItem value=\"recent\">{copy('recent')}</SelectItem><SelectItem value=\"amount\">{copy('amount')}</SelectItem></SelectContent></Select> : null}\n </FilterToolbar>\n <p role=\"status\" className=\"text-sm text-muted-foreground\">{copy('results', { count: rows.length })}</p>\n <div className=\"overflow-x-auto rounded-md border border-border\"><Table className=\"min-w-[440px]\">\n <TableHeader><TableRow><TableHead>{copy('name')}</TableHead><TableHead>{copy('status')}</TableHead>{showAmount ? <TableHead className=\"text-right\">{copy('amount')}</TableHead> : null}</TableRow></TableHeader>\n <TableBody>{rows.map(row => <TableRow key={row.name}><TableCell className=\"font-medium\">{row.name}</TableCell><TableCell>{copy(row.status)}</TableCell>{showAmount ? <TableCell className=\"text-right tabular-nums\">{row.amount.toLocaleString(undefined, { style: 'currency', currency: 'USD' })}</TableCell> : null}</TableRow>)}</TableBody>\n </Table></div>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setQuery(''); setCategory('all'); setFilters(emptyFilters()); setPeriod('7'); setEndDate(new Date(2023, 7, 11)); setSort('recent'); setShowAmount(true) }}>{copy('reset')}</Button>\n </div>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
4
|
+
import { SourceIcon, sourceIconNames } from "@open-mercato/ui/assets/source-icons";
|
|
5
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
|
+
import { Pagination } from "@open-mercato/ui/primitives/pagination";
|
|
7
|
+
import { SearchInput } from "@open-mercato/ui/primitives/search-input";
|
|
8
|
+
import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
|
|
9
|
+
import { Popover, PopoverContent, PopoverTrigger } from "@open-mercato/ui/primitives/popover";
|
|
10
|
+
const pageSize = 48;
|
|
11
|
+
function SourceIconTile({ name }) {
|
|
12
|
+
const t = useT();
|
|
13
|
+
const [notice, setNotice] = React.useState("");
|
|
14
|
+
const code = `import { SourceIcon } from '@open-mercato/ui/assets/source-icons'
|
|
15
|
+
|
|
16
|
+
<SourceIcon name="${name}" aria-hidden="true" className="size-6" />`;
|
|
17
|
+
async function copy() {
|
|
18
|
+
try {
|
|
19
|
+
await navigator.clipboard.writeText(code);
|
|
20
|
+
setNotice(t("design_system.gallery.sourceIcons.copied"));
|
|
21
|
+
} catch {
|
|
22
|
+
setNotice(t("design_system.gallery.copyFailed"));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return /* @__PURE__ */ jsxs(Popover, { onOpenChange: () => setNotice(""), children: [
|
|
26
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", "aria-label": name, className: "h-auto min-h-28 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3", children: [
|
|
27
|
+
/* @__PURE__ */ jsx(SourceIcon, { name, "aria-hidden": "true", className: "size-7" }),
|
|
28
|
+
/* @__PURE__ */ jsx("span", { className: "max-w-full break-words text-center text-xs font-normal leading-4 text-muted-foreground", children: name })
|
|
29
|
+
] }) }),
|
|
30
|
+
/* @__PURE__ */ jsxs(PopoverContent, { className: "w-72 space-y-4 p-4", "aria-label": name, children: [
|
|
31
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-24 items-center justify-center rounded-md bg-muted", children: /* @__PURE__ */ jsx(SourceIcon, { name, "aria-hidden": "true", className: "size-10" }) }),
|
|
32
|
+
/* @__PURE__ */ jsx("p", { className: "break-words font-medium", children: name }),
|
|
33
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: copy, children: t("design_system.gallery.sourceIcons.copy") }),
|
|
34
|
+
notice ? /* @__PURE__ */ jsx("p", { role: "status", className: "text-xs text-muted-foreground", children: notice }) : null
|
|
35
|
+
] })
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
function SourceIconCatalogue({ collectionControl } = {}) {
|
|
39
|
+
const t = useT();
|
|
40
|
+
const [query, setQuery] = React.useState("");
|
|
41
|
+
const [page, setPage] = React.useState(1);
|
|
42
|
+
const filtered = sourceIconNames.filter((name) => name.includes(query.trim().toLowerCase()));
|
|
43
|
+
const visible = filtered.slice((page - 1) * pageSize, page * pageSize);
|
|
44
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-5", "data-example": "source-icon-catalogue", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-4", children: [
|
|
46
|
+
collectionControl,
|
|
47
|
+
/* @__PURE__ */ jsx(SearchInput, { value: query, onChange: (value) => {
|
|
48
|
+
setQuery(value);
|
|
49
|
+
setPage(1);
|
|
50
|
+
}, "aria-label": t("design_system.gallery.iconSearchPlaceholder"), placeholder: t("design_system.gallery.iconSearchPlaceholder"), className: "w-80 max-w-full" }),
|
|
51
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", role: "status", children: t("design_system.gallery.iconCountFiltered", { visible: filtered.length, total: sourceIconNames.length }) })
|
|
52
|
+
] }),
|
|
53
|
+
visible.length ? /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-6", children: visible.map((name) => /* @__PURE__ */ jsx(SourceIconTile, { name }, name)) }) : /* @__PURE__ */ jsx(EmptyState, { title: t("design_system.gallery.noResults") }),
|
|
54
|
+
filtered.length > pageSize ? /* @__PURE__ */ jsx(Pagination, { page, pageSize, total: filtered.length, showPageSize: false, onPageChange: setPage, "aria-label": t("design_system.gallery.sourceIcons.pages") }) : null
|
|
55
|
+
] });
|
|
56
|
+
}
|
|
57
|
+
const sourceIconCatalogueCode = `import { SourceIcon, sourceIconNames } from '@open-mercato/ui/assets/source-icons'
|
|
58
|
+
|
|
59
|
+
<div className="grid grid-cols-4 gap-4">
|
|
60
|
+
{sourceIconNames.map(name => <div key={name} className="flex items-center gap-2">
|
|
61
|
+
<SourceIcon name={name} aria-hidden="true" />
|
|
62
|
+
<span>{name}</span>
|
|
63
|
+
</div>)}
|
|
64
|
+
</div>`;
|
|
65
|
+
export {
|
|
66
|
+
SourceIconCatalogue,
|
|
67
|
+
sourceIconCatalogueCode
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=source-icons.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/demos/source-icons.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { SourceIcon, sourceIconNames, type SourceIconName } from '@open-mercato/ui/assets/source-icons'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Pagination } from '@open-mercato/ui/primitives/pagination'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Popover, PopoverContent, PopoverTrigger } from '@open-mercato/ui/primitives/popover'\n\nconst pageSize = 48\n\nfunction SourceIconTile({ name }: { name: SourceIconName }) {\n const t = useT()\n const [notice, setNotice] = React.useState('')\n const code = `import { SourceIcon } from '@open-mercato/ui/assets/source-icons'\\n\\n<SourceIcon name=\"${name}\" aria-hidden=\"true\" className=\"size-6\" />`\n async function copy() {\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\" aria-label={name} className=\"h-auto min-h-28 min-w-0 flex-col gap-3 whitespace-normal rounded-lg border border-border bg-background p-3\">\n <SourceIcon name={name} aria-hidden=\"true\" className=\"size-7\" />\n <span className=\"max-w-full break-words text-center text-xs font-normal leading-4 text-muted-foreground\">{name}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 space-y-4 p-4\" aria-label={name}>\n <div className=\"flex h-24 items-center justify-center rounded-md bg-muted\"><SourceIcon name={name} aria-hidden=\"true\" className=\"size-10\" /></div>\n <p className=\"break-words font-medium\">{name}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" 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 SourceIconCatalogue({ collectionControl }: { collectionControl?: React.ReactNode } = {}) {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const [page, setPage] = React.useState(1)\n const filtered = sourceIconNames.filter(name => name.includes(query.trim().toLowerCase()))\n const visible = filtered.slice((page - 1) * pageSize, page * pageSize)\n return <div className=\"w-full min-w-0 space-y-5\" data-example=\"source-icon-catalogue\">\n <div className=\"flex flex-wrap items-center gap-4\">\n {collectionControl}\n <SearchInput value={query} onChange={value => { setQuery(value); setPage(1) }} aria-label={t('design_system.gallery.iconSearchPlaceholder')} placeholder={t('design_system.gallery.iconSearchPlaceholder')} className=\"w-80 max-w-full\" />\n <p className=\"text-sm text-muted-foreground\" role=\"status\">{t('design_system.gallery.iconCountFiltered', { visible: filtered.length, total: sourceIconNames.length })}</p>\n </div>\n {visible.length ? <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4 lg:grid-cols-6\">\n {visible.map(name => <SourceIconTile key={name} name={name} />)}\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.sourceIcons.pages')} /> : null}\n </div>\n}\n\nexport const sourceIconCatalogueCode = `import { SourceIcon, sourceIconNames } from '@open-mercato/ui/assets/source-icons'\n\n<div className=\"grid grid-cols-4 gap-4\">\n {sourceIconNames.map(name => <div key={name} className=\"flex items-center gap-2\">\n <SourceIcon name={name} aria-hidden=\"true\" />\n <span>{name}</span>\n </div>)}\n</div>`\n"],
|
|
5
|
+
"mappings": "AAqBM,SACE,KADF;AArBN,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,YAAY,uBAA4C;AACjE,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,SAAS,gBAAgB,sBAAsB;AAExD,MAAM,WAAW;AAEjB,SAAS,eAAe,EAAE,KAAK,GAA6B;AAC1D,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAC7C,QAAM,OAAO;AAAA;AAAA,oBAA0F,IAAI;AAC3G,iBAAe,OAAO;AACpB,QAAI;AAAE,YAAM,UAAU,UAAU,UAAU,IAAI;AAAG,gBAAU,EAAE,0CAA0C,CAAC;AAAA,IAAE,QACpG;AAAE,gBAAU,EAAE,kCAAkC,CAAC;AAAA,IAAE;AAAA,EAC3D;AACA,SAAO,qBAAC,WAAQ,cAAc,MAAM,UAAU,EAAE,GAC9C;AAAA,wBAAC,kBAAe,SAAO,MACrB,+BAAC,UAAO,MAAK,UAAS,SAAQ,SAAQ,cAAY,MAAM,WAAU,8GAChE;AAAA,0BAAC,cAAW,MAAY,eAAY,QAAO,WAAU,UAAS;AAAA,MAC9D,oBAAC,UAAK,WAAU,0FAA0F,gBAAK;AAAA,OACjH,GACF;AAAA,IACA,qBAAC,kBAAe,WAAU,sBAAqB,cAAY,MACzD;AAAA,0BAAC,SAAI,WAAU,6DAA4D,8BAAC,cAAW,MAAY,eAAY,QAAO,WAAU,WAAU,GAAE;AAAA,MAC5I,oBAAC,OAAE,WAAU,2BAA2B,gBAAK;AAAA,MAC7C,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAO,YAAE,wCAAwC,GAAE;AAAA,MAC7G,SAAS,oBAAC,OAAE,MAAK,UAAS,WAAU,iCAAiC,kBAAO,IAAO;AAAA,OACtF;AAAA,KACF;AACF;AAEO,SAAS,oBAAoB,EAAE,kBAAkB,IAA6C,CAAC,GAAG;AACvG,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;AACxC,QAAM,WAAW,gBAAgB,OAAO,UAAQ,KAAK,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC,CAAC;AACzF,QAAM,UAAU,SAAS,OAAO,OAAO,KAAK,UAAU,OAAO,QAAQ;AACrE,SAAO,qBAAC,SAAI,WAAU,4BAA2B,gBAAa,yBAC5D;AAAA,yBAAC,SAAI,WAAU,qCACZ;AAAA;AAAA,MACD,oBAAC,eAAY,OAAO,OAAO,UAAU,WAAS;AAAE,iBAAS,KAAK;AAAG,gBAAQ,CAAC;AAAA,MAAE,GAAG,cAAY,EAAE,6CAA6C,GAAG,aAAa,EAAE,6CAA6C,GAAG,WAAU,mBAAkB;AAAA,MACxO,oBAAC,OAAE,WAAU,iCAAgC,MAAK,UAAU,YAAE,2CAA2C,EAAE,SAAS,SAAS,QAAQ,OAAO,gBAAgB,OAAO,CAAC,GAAE;AAAA,OACxK;AAAA,IACC,QAAQ,SAAS,oBAAC,SAAI,WAAU,wDAC9B,kBAAQ,IAAI,UAAQ,oBAAC,kBAA0B,QAAN,IAAkB,CAAE,GAChE,IAAS,oBAAC,cAAW,OAAO,EAAE,iCAAiC,GAAG;AAAA,IACjE,SAAS,SAAS,WAAW,oBAAC,cAAW,MAAY,UAAoB,OAAO,SAAS,QAAQ,cAAc,OAAO,cAAc,SAAS,cAAY,EAAE,yCAAyC,GAAG,IAAK;AAAA,KAC/M;AACF;AAEO,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|