@open-mercato/core 0.7.1-develop.7202.1.a52dc6707c → 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,93 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { GalleryLink as Link } from "./GalleryLink.js";
|
|
5
|
+
import { ArrowRight } from "lucide-react";
|
|
6
|
+
import { LinkButton } from "@open-mercato/ui/primitives/link-button";
|
|
7
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
8
|
+
import { EmptyState } from "@open-mercato/ui/primitives/empty-state";
|
|
9
|
+
import { Pagination } from "@open-mercato/ui/primitives/pagination";
|
|
10
|
+
import { SearchInput } from "@open-mercato/ui/primitives/search-input";
|
|
11
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@open-mercato/ui/primitives/select";
|
|
12
|
+
import { GALLERY_BASE_PATH } from "../registry.js";
|
|
13
|
+
import { sourceLibrary } from "../source-library.generated.js";
|
|
14
|
+
const pageSize = 12;
|
|
15
|
+
const allGroups = "__all";
|
|
16
|
+
const groupTranslationKey = (group) => `design_system.gallery.sourceLibrary.groups.${group.toLowerCase().replace(/\s+/g, "-")}`;
|
|
17
|
+
function SourceLibrary() {
|
|
18
|
+
const t = useT();
|
|
19
|
+
const storyTitle = (story) => story.family === "foundations" ? t(`design_system.foundations.${story.entryId}.title`, story.title) : story.title;
|
|
20
|
+
const [query, setQuery] = React.useState("");
|
|
21
|
+
const [group, setGroup] = React.useState(allGroups);
|
|
22
|
+
const [page, setPage] = React.useState(1);
|
|
23
|
+
const groups = React.useMemo(() => Array.from(new Set(sourceLibrary.pages.map((item) => item.group))), []);
|
|
24
|
+
const needle = query.trim().toLowerCase();
|
|
25
|
+
const filtered = sourceLibrary.pages.filter((item) => {
|
|
26
|
+
const matchesGroup = group === allGroups || item.group === group;
|
|
27
|
+
const translatedName = t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name);
|
|
28
|
+
const translatedGroup = t(groupTranslationKey(item.group), item.group);
|
|
29
|
+
const searchTerms = t(`design_system.gallery.sourceLibrary.searchTerms.${item.id}`, "");
|
|
30
|
+
const searchable = `${item.name} ${translatedName} ${item.group} ${translatedGroup} ${searchTerms} ${item.stories.map((story) => `${story.title} ${storyTitle(story)}`).join(" ")} ${item.sets.map((set) => `${set.name} ${Object.values(set.axes).flat().join(" ")}`).join(" ")} ${item.standalone.map((asset) => asset.name).join(" ")}`;
|
|
31
|
+
return matchesGroup && searchable.toLowerCase().includes(needle);
|
|
32
|
+
});
|
|
33
|
+
const visible = filtered.slice((page - 1) * pageSize, page * pageSize);
|
|
34
|
+
return /* @__PURE__ */ jsxs("div", { className: "w-full min-w-0 space-y-4", "data-example": "native-source-library", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceLibrary.boundary") }),
|
|
36
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row", children: [
|
|
37
|
+
/* @__PURE__ */ jsx(SearchInput, { className: "sm:flex-1", value: query, onChange: (value) => {
|
|
38
|
+
setQuery(value);
|
|
39
|
+
setPage(1);
|
|
40
|
+
}, "aria-label": t("design_system.gallery.sourceLibrary.search"), placeholder: t("design_system.gallery.sourceLibrary.search") }),
|
|
41
|
+
/* @__PURE__ */ jsxs(Select, { value: group, onValueChange: (value) => {
|
|
42
|
+
setGroup(value);
|
|
43
|
+
setPage(1);
|
|
44
|
+
}, children: [
|
|
45
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-full sm:w-64", "aria-label": t("design_system.gallery.sourceLibrary.group"), children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
46
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
47
|
+
/* @__PURE__ */ jsx(SelectItem, { value: allGroups, children: t("design_system.gallery.sourceLibrary.allGroups") }),
|
|
48
|
+
groups.map((value) => /* @__PURE__ */ jsx(SelectItem, { value, children: t(groupTranslationKey(value), value) }, value))
|
|
49
|
+
] })
|
|
50
|
+
] })
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceLibrary.count", { visible: filtered.length, total: sourceLibrary.pages.length }) }),
|
|
53
|
+
visible.length ? /* @__PURE__ */ jsx("div", { className: "divide-y divide-border rounded-lg border border-border bg-card", children: visible.map((item) => {
|
|
54
|
+
const variantCount = item.sets.reduce((total, set) => total + set.count, 0);
|
|
55
|
+
const hasInventory = item.sets.length > 0 || item.standaloneCount > 0 || item.frameCount > 0;
|
|
56
|
+
return /* @__PURE__ */ jsxs("article", { className: "grid min-w-0 gap-4 p-5 lg:grid-cols-3", children: [
|
|
57
|
+
/* @__PURE__ */ jsxs("header", { className: "space-y-1", children: [
|
|
58
|
+
/* @__PURE__ */ jsx("h3", { className: "text-base font-semibold leading-tight", children: t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name) }),
|
|
59
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t(groupTranslationKey(item.group), item.group) })
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-3 lg:col-span-2", children: [
|
|
62
|
+
item.stories.length ? /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-6 gap-y-3", "aria-label": t("design_system.gallery.sourceLibrary.examples"), children: item.stories.map((story) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(LinkButton, { asChild: true, variant: "black", children: /* @__PURE__ */ jsxs(Link, { href: `${GALLERY_BASE_PATH}?family=${story.family}&entry=${story.entryId}`, children: [
|
|
63
|
+
storyTitle(story),
|
|
64
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "size-4 text-muted-foreground", "aria-hidden": "true" })
|
|
65
|
+
] }) }) }, `${story.family}:${story.entryId}`)) }) : /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("design_system.gallery.sourceLibrary.referenceOnly") }),
|
|
66
|
+
hasInventory ? /* @__PURE__ */ jsxs("section", { className: "text-sm", children: [
|
|
67
|
+
/* @__PURE__ */ jsx("h4", { className: "text-xs font-medium text-muted-foreground", children: t("design_system.gallery.sourceLibrary.details") }),
|
|
68
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-4 border-l border-border pl-4", children: [
|
|
69
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground", children: [
|
|
70
|
+
item.sets.length ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.componentSets", { count: item.sets.length }) }) : null,
|
|
71
|
+
variantCount ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.variants", { count: variantCount }) }) : null,
|
|
72
|
+
item.frameCount ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.frames", { count: item.frameCount }) }) : null,
|
|
73
|
+
item.standaloneCount ? /* @__PURE__ */ jsx("span", { children: t("design_system.gallery.sourceLibrary.assets", { count: item.standaloneCount }) }) : null
|
|
74
|
+
] }),
|
|
75
|
+
item.sets.map((set) => /* @__PURE__ */ jsxs("section", { className: "space-y-2", children: [
|
|
76
|
+
/* @__PURE__ */ jsx("h4", { className: "text-sm font-medium", children: set.name }),
|
|
77
|
+
/* @__PURE__ */ jsx("dl", { className: "space-y-2", children: Object.entries(set.axes).map(([axis, values]) => /* @__PURE__ */ jsxs("div", { className: "text-xs", children: [
|
|
78
|
+
/* @__PURE__ */ jsx("dt", { className: "font-medium", children: axis }),
|
|
79
|
+
/* @__PURE__ */ jsx("dd", { className: "break-words text-muted-foreground", children: values.join(" \xB7 ") })
|
|
80
|
+
] }, axis)) })
|
|
81
|
+
] }, set.id))
|
|
82
|
+
] })
|
|
83
|
+
] }) : null
|
|
84
|
+
] })
|
|
85
|
+
] }, item.id);
|
|
86
|
+
}) }) : /* @__PURE__ */ jsx(EmptyState, { title: t("design_system.gallery.noResults") }),
|
|
87
|
+
filtered.length > pageSize ? /* @__PURE__ */ jsx(Pagination, { page, pageSize, total: filtered.length, showPageSize: false, onPageChange: setPage, "aria-label": t("design_system.gallery.sourceLibrary.pages") }) : null
|
|
88
|
+
] });
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
SourceLibrary
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=SourceLibrary.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/components/SourceLibrary.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { GalleryLink as Link } from './GalleryLink'\nimport { ArrowRight } from 'lucide-react'\nimport { LinkButton } from '@open-mercato/ui/primitives/link-button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { EmptyState } from '@open-mercato/ui/primitives/empty-state'\nimport { Pagination } from '@open-mercato/ui/primitives/pagination'\nimport { SearchInput } from '@open-mercato/ui/primitives/search-input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@open-mercato/ui/primitives/select'\nimport { GALLERY_BASE_PATH } from '../registry'\nimport { sourceLibrary } from '../source-library.generated'\n\nconst pageSize = 12\nconst allGroups = '__all'\nconst groupTranslationKey = (group: string) => `design_system.gallery.sourceLibrary.groups.${group.toLowerCase().replace(/\\s+/g, '-')}`\n\nexport function SourceLibrary() {\n const t = useT()\n const storyTitle = (story: { family: string; entryId: string; title: string }) => story.family === 'foundations'\n ? t(`design_system.foundations.${story.entryId}.title`, story.title)\n : story.title\n const [query, setQuery] = React.useState('')\n const [group, setGroup] = React.useState(allGroups)\n const [page, setPage] = React.useState(1)\n const groups = React.useMemo(() => Array.from(new Set(sourceLibrary.pages.map(item => item.group))), [])\n const needle = query.trim().toLowerCase()\n const filtered = sourceLibrary.pages.filter(item => {\n const matchesGroup = group === allGroups || item.group === group\n const translatedName = t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name)\n const translatedGroup = t(groupTranslationKey(item.group), item.group)\n const searchTerms = t(`design_system.gallery.sourceLibrary.searchTerms.${item.id}`, '')\n const searchable = `${item.name} ${translatedName} ${item.group} ${translatedGroup} ${searchTerms} ${item.stories.map(story => `${story.title} ${storyTitle(story)}`).join(' ')} ${item.sets.map(set => `${set.name} ${Object.values(set.axes).flat().join(' ')}`).join(' ')} ${item.standalone.map(asset => asset.name).join(' ')}`\n return matchesGroup && searchable.toLowerCase().includes(needle)\n })\n const visible = filtered.slice((page - 1) * pageSize, page * pageSize)\n\n return <div className=\"w-full min-w-0 space-y-4\" data-example=\"native-source-library\">\n <p className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceLibrary.boundary')}</p>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <SearchInput className=\"sm:flex-1\" value={query} onChange={value => { setQuery(value); setPage(1) }} aria-label={t('design_system.gallery.sourceLibrary.search')} placeholder={t('design_system.gallery.sourceLibrary.search')} />\n <Select value={group} onValueChange={value => { setGroup(value); setPage(1) }}>\n <SelectTrigger className=\"w-full sm:w-64\" aria-label={t('design_system.gallery.sourceLibrary.group')}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={allGroups}>{t('design_system.gallery.sourceLibrary.allGroups')}</SelectItem>\n {groups.map(value => <SelectItem key={value} value={value}>{t(groupTranslationKey(value), value)}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n <p role=\"status\" className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceLibrary.count', { visible: filtered.length, total: sourceLibrary.pages.length })}</p>\n {visible.length ? <div className=\"divide-y divide-border rounded-lg border border-border bg-card\">{visible.map(item => {\n const variantCount = item.sets.reduce((total, set) => total + set.count, 0)\n const hasInventory = item.sets.length > 0 || item.standaloneCount > 0 || item.frameCount > 0\n return <article key={item.id} className=\"grid min-w-0 gap-4 p-5 lg:grid-cols-3\">\n <header className=\"space-y-1\">\n <h3 className=\"text-base font-semibold leading-tight\">{t(`design_system.gallery.sourceLibrary.names.${item.id}`, item.name)}</h3>\n <p className=\"text-xs text-muted-foreground\">{t(groupTranslationKey(item.group), item.group)}</p>\n </header>\n <div className=\"min-w-0 space-y-3 lg:col-span-2\">\n {item.stories.length ? <ul className=\"flex flex-wrap gap-x-6 gap-y-3\" aria-label={t('design_system.gallery.sourceLibrary.examples')}>\n {item.stories.map(story => <li key={`${story.family}:${story.entryId}`}>\n <LinkButton asChild variant=\"black\">\n <Link href={`${GALLERY_BASE_PATH}?family=${story.family}&entry=${story.entryId}`}>\n {storyTitle(story)}<ArrowRight className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </Link>\n </LinkButton>\n </li>)}\n </ul> : <p className=\"text-sm text-muted-foreground\">{t('design_system.gallery.sourceLibrary.referenceOnly')}</p>}\n {hasInventory ? <section className=\"text-sm\">\n <h4 className=\"text-xs font-medium text-muted-foreground\">{t('design_system.gallery.sourceLibrary.details')}</h4>\n <div className=\"mt-3 space-y-4 border-l border-border pl-4\">\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {item.sets.length ? <span>{t('design_system.gallery.sourceLibrary.componentSets', { count: item.sets.length })}</span> : null}\n {variantCount ? <span>{t('design_system.gallery.sourceLibrary.variants', { count: variantCount })}</span> : null}\n {item.frameCount ? <span>{t('design_system.gallery.sourceLibrary.frames', { count: item.frameCount })}</span> : null}\n {item.standaloneCount ? <span>{t('design_system.gallery.sourceLibrary.assets', { count: item.standaloneCount })}</span> : null}\n </div>\n {item.sets.map(set => <section key={set.id} className=\"space-y-2\">\n <h4 className=\"text-sm font-medium\">{set.name}</h4>\n <dl className=\"space-y-2\">{Object.entries(set.axes).map(([axis, values]) => <div key={axis} className=\"text-xs\"><dt className=\"font-medium\">{axis}</dt><dd className=\"break-words text-muted-foreground\">{(values as string[]).join(' \u00B7 ')}</dd></div>)}</dl>\n </section>)}\n </div>\n </section> : null}\n </div>\n </article>\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.sourceLibrary.pages')} /> : null}\n </div>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Check, ImagePlus, RotateCcw, Upload, X } from "lucide-react";
|
|
5
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
6
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
7
|
+
import { SimpleTooltip } from "@open-mercato/ui/primitives/tooltip";
|
|
8
|
+
import { getBrandStyle, saveBrandStyle } from "@open-mercato/ui/theme/brand-style";
|
|
9
|
+
import { ColorPlayground } from "./ColorPlayground.js";
|
|
10
|
+
import { BrandStylePreview } from "./BrandStylePreview.js";
|
|
11
|
+
import { readThemeTokens } from "./themeTokens.js";
|
|
12
|
+
import { readBrandLogo, studioBrandStyle } from "./styleAgentBranding.js";
|
|
13
|
+
function brandPreview(studio, logo) {
|
|
14
|
+
const style = studioBrandStyle(studio, logo);
|
|
15
|
+
return { light: style.light, dark: style.dark };
|
|
16
|
+
}
|
|
17
|
+
function StyleAgents() {
|
|
18
|
+
const t = useT();
|
|
19
|
+
const input = React.useRef(null);
|
|
20
|
+
const uploadVersion = React.useRef(0);
|
|
21
|
+
const [initial, setInitial] = React.useState(void 0);
|
|
22
|
+
const [hostTokens, setHostTokens] = React.useState(null);
|
|
23
|
+
const [logo, setLogo] = React.useState(null);
|
|
24
|
+
const [draft, setDraft] = React.useState(null);
|
|
25
|
+
const [uploading, setUploading] = React.useState(false);
|
|
26
|
+
const [notice, setNotice] = React.useState("");
|
|
27
|
+
const [error, setError] = React.useState("");
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
setHostTokens(readThemeTokens(document.styleSheets));
|
|
30
|
+
const applied = getBrandStyle();
|
|
31
|
+
setInitial(applied);
|
|
32
|
+
setLogo(applied?.logo ?? null);
|
|
33
|
+
return () => {
|
|
34
|
+
uploadVersion.current += 1;
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
const updateStudio = React.useCallback((studio, valid) => {
|
|
38
|
+
setDraft({ studio, valid });
|
|
39
|
+
setNotice("");
|
|
40
|
+
}, []);
|
|
41
|
+
async function upload(file) {
|
|
42
|
+
if (!file) return;
|
|
43
|
+
const version = ++uploadVersion.current;
|
|
44
|
+
setUploading(true);
|
|
45
|
+
setError("");
|
|
46
|
+
setNotice("");
|
|
47
|
+
try {
|
|
48
|
+
const data = await readBrandLogo(file);
|
|
49
|
+
if (uploadVersion.current === version) setLogo(data);
|
|
50
|
+
} catch (failure) {
|
|
51
|
+
if (uploadVersion.current === version) setError(failure instanceof Error ? failure.message : "fileDecode");
|
|
52
|
+
} finally {
|
|
53
|
+
if (uploadVersion.current === version) setUploading(false);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function apply() {
|
|
57
|
+
if (!draft?.valid || uploading) return;
|
|
58
|
+
try {
|
|
59
|
+
saveBrandStyle(studioBrandStyle(draft.studio, logo));
|
|
60
|
+
setError("");
|
|
61
|
+
setNotice("applied");
|
|
62
|
+
} catch {
|
|
63
|
+
setError("saveFailed");
|
|
64
|
+
setNotice("");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function restore() {
|
|
68
|
+
try {
|
|
69
|
+
saveBrandStyle(null);
|
|
70
|
+
setError("");
|
|
71
|
+
setNotice("restored");
|
|
72
|
+
} catch {
|
|
73
|
+
setError("saveFailed");
|
|
74
|
+
setNotice("");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-8 pb-8", "data-example": "style-agents", children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("header", { id: "gallery-page-heading", className: "scroll-mt-36 space-y-3 lg:scroll-mt-24", children: [
|
|
79
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
|
|
80
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
81
|
+
/* @__PURE__ */ jsx("h1", { className: "text-3xl font-medium tracking-tight", children: t("design_system.styleAgents.title") }),
|
|
82
|
+
/* @__PURE__ */ jsx("p", { className: "max-w-3xl text-sm leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.description") })
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
85
|
+
/* @__PURE__ */ jsx(SimpleTooltip, { content: t("design_system.styleAgents.restoreHint"), children: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", onClick: restore, children: [
|
|
86
|
+
/* @__PURE__ */ jsx(RotateCcw, { "aria-hidden": true }),
|
|
87
|
+
t("design_system.styleAgents.restore")
|
|
88
|
+
] }) }),
|
|
89
|
+
/* @__PURE__ */ jsxs(Button, { type: "button", onClick: apply, disabled: !draft?.valid || uploading, children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Check, { "aria-hidden": true }),
|
|
91
|
+
t("design_system.styleAgents.apply")
|
|
92
|
+
] })
|
|
93
|
+
] })
|
|
94
|
+
] }),
|
|
95
|
+
notice ? /* @__PURE__ */ jsx("p", { role: "status", className: "text-sm text-status-success-text", children: t(`design_system.styleAgents.${notice}`) }) : null,
|
|
96
|
+
error ? /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm text-status-error-text", children: t(`design_system.styleAgents.${error}`) }) : null
|
|
97
|
+
] }),
|
|
98
|
+
/* @__PURE__ */ jsxs("section", { className: "grid gap-6 rounded-xl border border-border bg-card p-5 sm:p-6 lg:grid-cols-2", "aria-label": t("design_system.styleAgents.identity"), children: [
|
|
99
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
100
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
101
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-medium", children: t("design_system.styleAgents.logo") }),
|
|
102
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.logoHint") })
|
|
103
|
+
] }),
|
|
104
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-h-28 items-center justify-center rounded-lg border border-dashed border-border bg-background p-6", children: logo ? /* @__PURE__ */ jsx("img", { src: logo, alt: t("design_system.styleAgents.logoPreview"), className: "max-h-20 max-w-full object-contain" }) : /* @__PURE__ */ jsx(ImagePlus, { className: "size-8 text-muted-foreground", "aria-hidden": true }) }),
|
|
105
|
+
/* @__PURE__ */ jsx("input", { ref: input, type: "file", accept: "image/png,image/jpeg,image/webp", className: "sr-only", "aria-label": t("design_system.styleAgents.upload"), onChange: (event) => {
|
|
106
|
+
void upload(event.target.files?.[0]);
|
|
107
|
+
event.target.value = "";
|
|
108
|
+
} }),
|
|
109
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
|
|
110
|
+
/* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", onClick: () => input.current?.click(), children: [
|
|
111
|
+
/* @__PURE__ */ jsx(Upload, { "aria-hidden": true }),
|
|
112
|
+
t(`design_system.styleAgents.${uploading ? "uploading" : "upload"}`)
|
|
113
|
+
] }),
|
|
114
|
+
logo ? /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", onClick: () => {
|
|
115
|
+
uploadVersion.current += 1;
|
|
116
|
+
setUploading(false);
|
|
117
|
+
setLogo(null);
|
|
118
|
+
setNotice("");
|
|
119
|
+
setError("");
|
|
120
|
+
}, children: [
|
|
121
|
+
/* @__PURE__ */ jsx(X, { "aria-hidden": true }),
|
|
122
|
+
t("design_system.styleAgents.removeLogo")
|
|
123
|
+
] }) : null
|
|
124
|
+
] })
|
|
125
|
+
] }),
|
|
126
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col justify-between gap-5", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
127
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-medium", children: t("design_system.styleAgents.applyTitle") }),
|
|
128
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.scope") }),
|
|
129
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: t("design_system.styleAgents.tokenScope") })
|
|
130
|
+
] }) })
|
|
131
|
+
] }),
|
|
132
|
+
draft ? /* @__PURE__ */ jsx(BrandStylePreview, { ...brandPreview(draft.studio, logo), hostTokens, logo }) : null,
|
|
133
|
+
initial !== void 0 ? /* @__PURE__ */ jsx(ColorPlayground, { initialView: "light", initialSeeds: initial?.seeds, initialActionShades: initial?.actionShades, logo, onStudioChange: updateStudio }) : null
|
|
134
|
+
] });
|
|
135
|
+
}
|
|
136
|
+
export {
|
|
137
|
+
StyleAgents
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=StyleAgents.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/components/StyleAgents.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { Check, ImagePlus, RotateCcw, Upload, X } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { SimpleTooltip } from '@open-mercato/ui/primitives/tooltip'\nimport { getBrandStyle, saveBrandStyle, type BrandStyle } from '@open-mercato/ui/theme/brand-style'\nimport { ColorPlayground } from './ColorPlayground'\nimport { BrandStylePreview } from './BrandStylePreview'\nimport { readThemeTokens, type ThemeTokens } from './themeTokens'\nimport type { Shade } from './colorStudio'\nimport type { ColorStudio } from './colorStudio'\nimport { readBrandLogo, studioBrandStyle } from './styleAgentBranding'\n\nfunction brandPreview(studio: ColorStudio, logo: string | null) {\n const style = studioBrandStyle(studio, logo)\n return { light: style.light, dark: style.dark }\n}\n\nexport function StyleAgents() {\n const t = useT()\n const input = React.useRef<HTMLInputElement>(null)\n const uploadVersion = React.useRef(0)\n const [initial, setInitial] = React.useState<BrandStyle | null | undefined>(undefined)\n const [hostTokens, setHostTokens] = React.useState<ThemeTokens | null>(null)\n const [logo, setLogo] = React.useState<string | null>(null)\n const [draft, setDraft] = React.useState<{ studio: ColorStudio; valid: boolean } | null>(null)\n const [uploading, setUploading] = React.useState(false)\n const [notice, setNotice] = React.useState('')\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n setHostTokens(readThemeTokens(document.styleSheets))\n const applied = getBrandStyle()\n setInitial(applied)\n setLogo(applied?.logo ?? null)\n return () => { uploadVersion.current += 1 }\n }, [])\n const updateStudio = React.useCallback((studio: ColorStudio, valid: boolean) => {\n setDraft({ studio, valid })\n setNotice('')\n }, [])\n\n async function upload(file: File | undefined) {\n if (!file) return\n const version = ++uploadVersion.current\n setUploading(true)\n setError('')\n setNotice('')\n try {\n const data = await readBrandLogo(file)\n if (uploadVersion.current === version) setLogo(data)\n } catch (failure) {\n if (uploadVersion.current === version) setError(failure instanceof Error ? failure.message : 'fileDecode')\n } finally {\n if (uploadVersion.current === version) setUploading(false)\n }\n }\n\n function apply() {\n if (!draft?.valid || uploading) return\n try {\n saveBrandStyle(studioBrandStyle(draft.studio, logo))\n setError('')\n setNotice('applied')\n } catch { setError('saveFailed'); setNotice('') }\n }\n\n function restore() {\n try {\n saveBrandStyle(null)\n setError('')\n setNotice('restored')\n } catch { setError('saveFailed'); setNotice('') }\n }\n\n return <div className=\"space-y-8 pb-8\" data-example=\"style-agents\">\n <header id=\"gallery-page-heading\" className=\"scroll-mt-36 space-y-3 lg:scroll-mt-24\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"space-y-3\">\n <h1 className=\"text-3xl font-medium tracking-tight\">{t('design_system.styleAgents.title')}</h1>\n <p className=\"max-w-3xl text-sm leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.description')}</p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <SimpleTooltip content={t('design_system.styleAgents.restoreHint')}>\n <Button type=\"button\" variant=\"ghost\" onClick={restore}><RotateCcw aria-hidden />{t('design_system.styleAgents.restore')}</Button>\n </SimpleTooltip>\n <Button type=\"button\" onClick={apply} disabled={!draft?.valid || uploading}><Check aria-hidden />{t('design_system.styleAgents.apply')}</Button>\n </div>\n </div>\n {notice ? <p role=\"status\" className=\"text-sm text-status-success-text\">{t(`design_system.styleAgents.${notice}`)}</p> : null}\n {error ? <p role=\"alert\" className=\"text-sm text-status-error-text\">{t(`design_system.styleAgents.${error}`)}</p> : null}\n </header>\n <section className=\"grid gap-6 rounded-xl border border-border bg-card p-5 sm:p-6 lg:grid-cols-2\" aria-label={t('design_system.styleAgents.identity')}>\n <div className=\"space-y-4\">\n <div className=\"space-y-1\"><h2 className=\"text-lg font-medium\">{t('design_system.styleAgents.logo')}</h2><p className=\"text-xs leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.logoHint')}</p></div>\n <div className=\"flex min-h-28 items-center justify-center rounded-lg border border-dashed border-border bg-background p-6\">\n {logo ? <img src={logo} alt={t('design_system.styleAgents.logoPreview')} className=\"max-h-20 max-w-full object-contain\" /> : <ImagePlus className=\"size-8 text-muted-foreground\" aria-hidden />}\n </div>\n <input ref={input} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" className=\"sr-only\" aria-label={t('design_system.styleAgents.upload')} onChange={event => { void upload(event.target.files?.[0]); event.target.value = '' }} />\n <div className=\"flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => input.current?.click()}><Upload aria-hidden />{t(`design_system.styleAgents.${uploading ? 'uploading' : 'upload'}`)}</Button>\n {logo ? <Button type=\"button\" variant=\"ghost\" onClick={() => { uploadVersion.current += 1; setUploading(false); setLogo(null); setNotice(''); setError('') }}><X aria-hidden />{t('design_system.styleAgents.removeLogo')}</Button> : null}\n </div>\n </div>\n <div className=\"flex flex-col justify-between gap-5\">\n <div className=\"space-y-3\"><h2 className=\"text-lg font-medium\">{t('design_system.styleAgents.applyTitle')}</h2><p className=\"text-sm leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.scope')}</p><p className=\"text-xs leading-relaxed text-muted-foreground\">{t('design_system.styleAgents.tokenScope')}</p></div>\n\n </div>\n </section>\n {draft ? <BrandStylePreview {...brandPreview(draft.studio, logo)} hostTokens={hostTokens} logo={logo} /> : null}\n {initial !== undefined ? <ColorPlayground initialView=\"light\" initialSeeds={initial?.seeds} initialActionShades={initial?.actionShades as { light?: Shade; dark?: Shade } | undefined} logo={logo} onStudioChange={updateStudio} /> : null}\n\n </div>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
5
|
+
import { DataTable } from "@open-mercato/ui/backend/DataTable";
|
|
6
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
7
|
+
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
8
|
+
import { readThemeTokens } from "./themeTokens.js";
|
|
9
|
+
const referenceTokens = [
|
|
10
|
+
"brand-lime",
|
|
11
|
+
"brand-yellow",
|
|
12
|
+
"brand-violet",
|
|
13
|
+
"background",
|
|
14
|
+
"foreground",
|
|
15
|
+
"card",
|
|
16
|
+
"card-foreground",
|
|
17
|
+
"muted",
|
|
18
|
+
"muted-foreground",
|
|
19
|
+
"primary",
|
|
20
|
+
"primary-foreground",
|
|
21
|
+
"primary-hover",
|
|
22
|
+
"border",
|
|
23
|
+
"input",
|
|
24
|
+
"ring",
|
|
25
|
+
"destructive",
|
|
26
|
+
"status-info-bg",
|
|
27
|
+
"status-info-text",
|
|
28
|
+
"status-success-bg",
|
|
29
|
+
"status-success-text",
|
|
30
|
+
"status-warning-bg",
|
|
31
|
+
"status-warning-text",
|
|
32
|
+
"status-error-bg",
|
|
33
|
+
"status-error-text"
|
|
34
|
+
];
|
|
35
|
+
function displayColor(value, context) {
|
|
36
|
+
if (!context || !CSS.supports("color", value)) return value;
|
|
37
|
+
context.clearRect(0, 0, 1, 1);
|
|
38
|
+
context.fillStyle = value;
|
|
39
|
+
context.fillRect(0, 0, 1, 1);
|
|
40
|
+
const [red, green, blue, alpha] = context.getImageData(0, 0, 1, 1).data;
|
|
41
|
+
return "#" + [red, green, blue, ...alpha === 255 ? [] : [alpha]].map((channel) => channel.toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
42
|
+
}
|
|
43
|
+
function ThemeTokenReference() {
|
|
44
|
+
const t = useT();
|
|
45
|
+
const [tokens, setTokens] = React.useState(null);
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
const values = readThemeTokens(document.styleSheets);
|
|
48
|
+
const canvas = document.createElement("canvas");
|
|
49
|
+
canvas.width = 1;
|
|
50
|
+
canvas.height = 1;
|
|
51
|
+
const context = canvas.getContext("2d", { willReadFrequently: true });
|
|
52
|
+
for (const theme of ["light", "dark"]) {
|
|
53
|
+
for (const token of referenceTokens) {
|
|
54
|
+
const value = values[theme][`--${token}`];
|
|
55
|
+
if (value) values[theme][`--${token}`] = displayColor(value, context);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
setTokens(values);
|
|
59
|
+
}, []);
|
|
60
|
+
const rows = referenceTokens.map((token) => ({ token: `--${token}`, light: tokens?.light[`--${token}`] ?? "\u2014", dark: tokens?.dark[`--${token}`] ?? "\u2014" }));
|
|
61
|
+
async function copyToken(token) {
|
|
62
|
+
try {
|
|
63
|
+
await navigator.clipboard.writeText(token);
|
|
64
|
+
flash(t("design_system.gallery.tokenCopied", { token }), "success");
|
|
65
|
+
} catch {
|
|
66
|
+
flash(t("design_system.gallery.tokenCopyFailed"), "error");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const columns = [
|
|
70
|
+
{ accessorKey: "token", header: t("design_system.foundations.token"), cell: ({ row }) => /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", className: "h-auto justify-start px-0 py-2 font-mono text-xs", "aria-label": t("design_system.gallery.copyToken", { token: row.original.token }), onClick: () => copyToken(row.original.token), children: row.original.token }) },
|
|
71
|
+
...["light", "dark"].map((theme) => ({
|
|
72
|
+
accessorKey: theme,
|
|
73
|
+
header: t(`design_system.foundations.${theme}`),
|
|
74
|
+
cell: ({ row }) => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-3 py-2", children: [
|
|
75
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "size-6 shrink-0 rounded-full border border-border", style: { backgroundColor: row.original[theme] === "\u2014" ? void 0 : row.original[theme] } }),
|
|
76
|
+
/* @__PURE__ */ jsx("code", { className: "text-xs text-muted-foreground", children: row.original[theme] })
|
|
77
|
+
] })
|
|
78
|
+
}))
|
|
79
|
+
];
|
|
80
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
81
|
+
/* @__PURE__ */ jsx("h3", { className: "text-xl font-medium", children: t("design_system.foundations.themeReference") }),
|
|
82
|
+
/* @__PURE__ */ jsx("p", { className: "max-w-prose text-sm leading-relaxed text-muted-foreground", children: t("design_system.foundations.themeDescription") }),
|
|
83
|
+
tokens ? /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2", children: ["light", "dark"].map((theme) => /* @__PURE__ */ jsxs("div", { className: "space-y-6 rounded-lg border p-6", style: { backgroundColor: tokens[theme]["--background"], color: tokens[theme]["--foreground"], borderColor: tokens[theme]["--border"] }, children: [
|
|
84
|
+
/* @__PURE__ */ jsx("p", { className: "text-base font-medium", children: t(`design_system.foundations.${theme}`) }),
|
|
85
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
86
|
+
/* @__PURE__ */ jsx(Button, { type: "button", style: { backgroundColor: tokens[theme]["--primary"], color: tokens[theme]["--primary-foreground"] }, children: t("design_system.gallery.samples.primaryAction") }),
|
|
87
|
+
/* @__PURE__ */ jsx("span", { className: "inline-flex h-9 items-center rounded-md border px-4 text-sm", style: { borderColor: tokens[theme]["--border"] }, children: "Aa" })
|
|
88
|
+
] }),
|
|
89
|
+
/* @__PURE__ */ jsxs("code", { className: "text-xs", style: { color: tokens[theme]["--muted-foreground"] }, children: [
|
|
90
|
+
tokens[theme]["--background"],
|
|
91
|
+
" / ",
|
|
92
|
+
tokens[theme]["--foreground"]
|
|
93
|
+
] })
|
|
94
|
+
] }, theme)) }) : null,
|
|
95
|
+
/* @__PURE__ */ jsx(DataTable, { columns, data: rows, isLoading: !tokens })
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
ThemeTokenReference
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=ThemeTokenReference.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/components/ThemeTokenReference.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { readThemeTokens, type ThemeTokens } from './themeTokens'\n\nconst referenceTokens = [\n 'brand-lime', 'brand-yellow', 'brand-violet', 'background', 'foreground',\n 'card', 'card-foreground', 'muted', 'muted-foreground', 'primary', 'primary-foreground',\n 'primary-hover', 'border', 'input', 'ring', 'destructive',\n 'status-info-bg', 'status-info-text', 'status-success-bg', 'status-success-text',\n 'status-warning-bg', 'status-warning-text', 'status-error-bg', 'status-error-text',\n]\ntype TokenRow = { token: string; light: string; dark: string }\n\nfunction displayColor(value: string, context: CanvasRenderingContext2D | null) {\n if (!context || !CSS.supports('color', value)) return value\n context.clearRect(0, 0, 1, 1)\n context.fillStyle = value\n context.fillRect(0, 0, 1, 1)\n const [red, green, blue, alpha] = context.getImageData(0, 0, 1, 1).data\n return '#' + [red, green, blue, ...(alpha === 255 ? [] : [alpha])].map(channel => channel.toString(16).padStart(2, '0')).join('').toUpperCase()\n}\n\nexport function ThemeTokenReference() {\n const t = useT()\n const [tokens, setTokens] = React.useState<ThemeTokens | null>(null)\n React.useEffect(() => {\n const values = readThemeTokens(document.styleSheets)\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = 1\n const context = canvas.getContext('2d', { willReadFrequently: true })\n for (const theme of ['light', 'dark'] as const) {\n for (const token of referenceTokens) {\n const value = values[theme][`--${token}`]\n if (value) values[theme][`--${token}`] = displayColor(value, context)\n }\n }\n setTokens(values)\n }, [])\n const rows = referenceTokens.map(token => ({ token: `--${token}`, light: tokens?.light[`--${token}`] ?? '\u2014', dark: tokens?.dark[`--${token}`] ?? '\u2014' }))\n async function copyToken(token: string) {\n try {\n await navigator.clipboard.writeText(token)\n flash(t('design_system.gallery.tokenCopied', { token }), 'success')\n } catch { flash(t('design_system.gallery.tokenCopyFailed'), 'error') }\n }\n const columns: ColumnDef<TokenRow, unknown>[] = [\n { accessorKey: 'token', header: t('design_system.foundations.token'), cell: ({ row }) => <Button type=\"button\" variant=\"ghost\" className=\"h-auto justify-start px-0 py-2 font-mono text-xs\" aria-label={t('design_system.gallery.copyToken', { token: row.original.token })} onClick={() => copyToken(row.original.token)}>{row.original.token}</Button> },\n ...(['light', 'dark'] as const).map(theme => ({\n accessorKey: theme,\n header: t(`design_system.foundations.${theme}`),\n cell: ({ row }: { row: { original: TokenRow } }) => <span className=\"flex items-center gap-3 py-2\"><span aria-hidden className=\"size-6 shrink-0 rounded-full border border-border\" style={{ backgroundColor: row.original[theme] === '\u2014' ? undefined : row.original[theme] }} /><code className=\"text-xs text-muted-foreground\">{row.original[theme]}</code></span>,\n })),\n ]\n return <div className=\"space-y-4\">\n <h3 className=\"text-xl font-medium\">{t('design_system.foundations.themeReference')}</h3>\n <p className=\"max-w-prose text-sm leading-relaxed text-muted-foreground\">{t('design_system.foundations.themeDescription')}</p>\n {tokens ? <div className=\"grid gap-4 sm:grid-cols-2\">\n {(['light', 'dark'] as const).map(theme => <div key={theme} className=\"space-y-6 rounded-lg border p-6\" style={{ backgroundColor: tokens[theme]['--background'], color: tokens[theme]['--foreground'], borderColor: tokens[theme]['--border'] }}>\n <p className=\"text-base font-medium\">{t(`design_system.foundations.${theme}`)}</p>\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button type=\"button\" style={{ backgroundColor: tokens[theme]['--primary'], color: tokens[theme]['--primary-foreground'] }}>{t('design_system.gallery.samples.primaryAction')}</Button>\n <span className=\"inline-flex h-9 items-center rounded-md border px-4 text-sm\" style={{ borderColor: tokens[theme]['--border'] }}>Aa</span>\n </div>\n <code className=\"text-xs\" style={{ color: tokens[theme]['--muted-foreground'] }}>{tokens[theme]['--background']} / {tokens[theme]['--foreground']}</code>\n </div>)}\n </div> : null}\n <DataTable columns={columns} data={rows} isLoading={!tokens} />\n </div>\n}\n"],
|
|
5
|
+
"mappings": ";AAqD6F,cAInC,YAJmC;AAnD7F,YAAY,WAAW;AAEvB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,uBAAyC;AAElD,MAAM,kBAAkB;AAAA,EACtB;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAgB;AAAA,EAAc;AAAA,EAC5D;AAAA,EAAQ;AAAA,EAAmB;AAAA,EAAS;AAAA,EAAoB;AAAA,EAAW;AAAA,EACnE;AAAA,EAAiB;AAAA,EAAU;AAAA,EAAS;AAAA,EAAQ;AAAA,EAC5C;AAAA,EAAkB;AAAA,EAAoB;AAAA,EAAqB;AAAA,EAC3D;AAAA,EAAqB;AAAA,EAAuB;AAAA,EAAmB;AACjE;AAGA,SAAS,aAAa,OAAe,SAA0C;AAC7E,MAAI,CAAC,WAAW,CAAC,IAAI,SAAS,SAAS,KAAK,EAAG,QAAO;AACtD,UAAQ,UAAU,GAAG,GAAG,GAAG,CAAC;AAC5B,UAAQ,YAAY;AACpB,UAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAC3B,QAAM,CAAC,KAAK,OAAO,MAAM,KAAK,IAAI,QAAQ,aAAa,GAAG,GAAG,GAAG,CAAC,EAAE;AACnE,SAAO,MAAM,CAAC,KAAK,OAAO,MAAM,GAAI,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAE,EAAE,IAAI,aAAW,QAAQ,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY;AAChJ;AAEO,SAAS,sBAAsB;AACpC,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAA6B,IAAI;AACnE,QAAM,UAAU,MAAM;AACpB,UAAM,SAAS,gBAAgB,SAAS,WAAW;AACnD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,UAAM,UAAU,OAAO,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;AACpE,eAAW,SAAS,CAAC,SAAS,MAAM,GAAY;AAC9C,iBAAW,SAAS,iBAAiB;AACnC,cAAM,QAAQ,OAAO,KAAK,EAAE,KAAK,KAAK,EAAE;AACxC,YAAI,MAAO,QAAO,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,aAAa,OAAO,OAAO;AAAA,MACtE;AAAA,IACF;AACA,cAAU,MAAM;AAAA,EAClB,GAAG,CAAC,CAAC;AACL,QAAM,OAAO,gBAAgB,IAAI,YAAU,EAAE,OAAO,KAAK,KAAK,IAAI,OAAO,QAAQ,MAAM,KAAK,KAAK,EAAE,KAAK,UAAK,MAAM,QAAQ,KAAK,KAAK,KAAK,EAAE,KAAK,SAAI,EAAE;AACvJ,iBAAe,UAAU,OAAe;AACtC,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK;AACzC,YAAM,EAAE,qCAAqC,EAAE,MAAM,CAAC,GAAG,SAAS;AAAA,IACpE,QAAQ;AAAE,YAAM,EAAE,uCAAuC,GAAG,OAAO;AAAA,IAAE;AAAA,EACvE;AACA,QAAM,UAA0C;AAAA,IAC9C,EAAE,aAAa,SAAS,QAAQ,EAAE,iCAAiC,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,oBAAC,UAAO,MAAK,UAAS,SAAQ,SAAQ,WAAU,oDAAmD,cAAY,EAAE,mCAAmC,EAAE,OAAO,IAAI,SAAS,MAAM,CAAC,GAAG,SAAS,MAAM,UAAU,IAAI,SAAS,KAAK,GAAI,cAAI,SAAS,OAAM,EAAU;AAAA,IACzV,GAAI,CAAC,SAAS,MAAM,EAAY,IAAI,YAAU;AAAA,MAC5C,aAAa;AAAA,MACb,QAAQ,EAAE,6BAA6B,KAAK,EAAE;AAAA,MAC9C,MAAM,CAAC,EAAE,IAAI,MAAuC,qBAAC,UAAK,WAAU,gCAA+B;AAAA,4BAAC,UAAK,eAAW,MAAC,WAAU,qDAAoD,OAAO,EAAE,iBAAiB,IAAI,SAAS,KAAK,MAAM,WAAM,SAAY,IAAI,SAAS,KAAK,EAAE,GAAG;AAAA,QAAE,oBAAC,UAAK,WAAU,iCAAiC,cAAI,SAAS,KAAK,GAAE;AAAA,SAAO;AAAA,IAC9V,EAAE;AAAA,EACJ;AACA,SAAO,qBAAC,SAAI,WAAU,aACpB;AAAA,wBAAC,QAAG,WAAU,uBAAuB,YAAE,0CAA0C,GAAE;AAAA,IACnF,oBAAC,OAAE,WAAU,6DAA6D,YAAE,4CAA4C,GAAE;AAAA,IACzH,SAAS,oBAAC,SAAI,WAAU,6BACrB,WAAC,SAAS,MAAM,EAAY,IAAI,WAAS,qBAAC,SAAgB,WAAU,mCAAkC,OAAO,EAAE,iBAAiB,OAAO,KAAK,EAAE,cAAc,GAAG,OAAO,OAAO,KAAK,EAAE,cAAc,GAAG,aAAa,OAAO,KAAK,EAAE,UAAU,EAAE,GAC5O;AAAA,0BAAC,OAAE,WAAU,yBAAyB,YAAE,6BAA6B,KAAK,EAAE,GAAE;AAAA,MAC9E,qBAAC,SAAI,WAAU,qCACb;AAAA,4BAAC,UAAO,MAAK,UAAS,OAAO,EAAE,iBAAiB,OAAO,KAAK,EAAE,WAAW,GAAG,OAAO,OAAO,KAAK,EAAE,sBAAsB,EAAE,GAAI,YAAE,6CAA6C,GAAE;AAAA,QAC9K,oBAAC,UAAK,WAAU,+DAA8D,OAAO,EAAE,aAAa,OAAO,KAAK,EAAE,UAAU,EAAE,GAAG,gBAAE;AAAA,SACrI;AAAA,MACA,qBAAC,UAAK,WAAU,WAAU,OAAO,EAAE,OAAO,OAAO,KAAK,EAAE,oBAAoB,EAAE,GAAI;AAAA,eAAO,KAAK,EAAE,cAAc;AAAA,QAAE;AAAA,QAAI,OAAO,KAAK,EAAE,cAAc;AAAA,SAAE;AAAA,SAN/F,KAOrD,CAAM,GACR,IAAS;AAAA,IACT,oBAAC,aAAU,SAAkB,MAAM,MAAM,WAAW,CAAC,QAAQ;AAAA,KAC/D;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
function VariantPreview({ children }) {
|
|
4
|
-
return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-
|
|
3
|
+
function VariantPreview({ children, framed = true }) {
|
|
4
|
+
return /* @__PURE__ */ jsx("div", { className: framed ? "flex min-w-0 flex-wrap items-start gap-4 rounded-lg border border-border bg-background p-4 sm:p-6 [&>*]:min-w-0" : "min-w-0 [&>*]:min-w-0", children });
|
|
5
5
|
}
|
|
6
6
|
export {
|
|
7
7
|
VariantPreview
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/design_system/gallery/components/VariantPreview.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\n\n/**\n * Bordered stage a variant renders inside. Chrome uses semantic tokens only \u2014\n * the stage must never impose colors of its own on the previewed component.\n */\nexport function VariantPreview({ children }: { children: React.ReactNode }) {\n return (\n <div className
|
|
5
|
-
"mappings": ";AAUI;AAFG,SAAS,eAAe,EAAE,SAAS,
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\n\n/**\n * Bordered stage a variant renders inside. Chrome uses semantic tokens only \u2014\n * the stage must never impose colors of its own on the previewed component.\n */\nexport function VariantPreview({ children, framed = true }: { children: React.ReactNode; framed?: boolean }) {\n return (\n <div className={framed ? 'flex min-w-0 flex-wrap items-start gap-4 rounded-lg border border-border bg-background p-4 sm:p-6 [&>*]:min-w-0' : 'min-w-0 [&>*]:min-w-0'}>\n {children}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AAUI;AAFG,SAAS,eAAe,EAAE,UAAU,SAAS,KAAK,GAAoD;AAC3G,SACE,oBAAC,SAAI,WAAW,SAAS,oHAAoH,yBAC1I,UACH;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function normalizeHex(input) {
|
|
2
|
+
const value = input.trim().replace(/^#/, "");
|
|
3
|
+
if (/^[\da-f]{3}$/i.test(value)) {
|
|
4
|
+
return `#${[...value].map((digit) => digit.repeat(2)).join("").toUpperCase()}`;
|
|
5
|
+
}
|
|
6
|
+
return /^[\da-f]{6}$/i.test(value) ? `#${value.toUpperCase()}` : null;
|
|
7
|
+
}
|
|
8
|
+
function channels(hex) {
|
|
9
|
+
return [
|
|
10
|
+
Number.parseInt(hex.slice(1, 3), 16),
|
|
11
|
+
Number.parseInt(hex.slice(3, 5), 16),
|
|
12
|
+
Number.parseInt(hex.slice(5, 7), 16)
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
function luminance(hex) {
|
|
16
|
+
const linear = channels(hex).map((channel) => {
|
|
17
|
+
const normalized = channel / 255;
|
|
18
|
+
return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
|
|
19
|
+
});
|
|
20
|
+
return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722;
|
|
21
|
+
}
|
|
22
|
+
function contrastRatio(first, second) {
|
|
23
|
+
const normalizedFirst = normalizeHex(first);
|
|
24
|
+
const normalizedSecond = normalizeHex(second);
|
|
25
|
+
if (!normalizedFirst || !normalizedSecond) return 1;
|
|
26
|
+
const firstLuminance = luminance(normalizedFirst);
|
|
27
|
+
const secondLuminance = luminance(normalizedSecond);
|
|
28
|
+
return (Math.max(firstLuminance, secondLuminance) + 0.05) / (Math.min(firstLuminance, secondLuminance) + 0.05);
|
|
29
|
+
}
|
|
30
|
+
function mix(color, target, amount) {
|
|
31
|
+
const targetChannels = channels(target);
|
|
32
|
+
return `#${channels(color).map((channel, index) => Math.round(channel + (targetChannels[index] - channel) * amount).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
|
|
33
|
+
}
|
|
34
|
+
function readableForeground(background) {
|
|
35
|
+
return contrastRatio(background, "#000000") >= contrastRatio(background, "#FFFFFF") ? "#000000" : "#FFFFFF";
|
|
36
|
+
}
|
|
37
|
+
function readableAccent(color, surface) {
|
|
38
|
+
const target = readableForeground(surface);
|
|
39
|
+
for (let step = 0; step <= 20; step += 1) {
|
|
40
|
+
const candidate = mix(color, target, step / 20);
|
|
41
|
+
if (contrastRatio(candidate, surface) >= 4.5) return candidate;
|
|
42
|
+
}
|
|
43
|
+
return target;
|
|
44
|
+
}
|
|
45
|
+
function createAccentPalette(hex, surface) {
|
|
46
|
+
const color = normalizeHex(hex) ?? "#000000";
|
|
47
|
+
const normalizedSurface = normalizeHex(surface) ?? "#FFFFFF";
|
|
48
|
+
const foreground = readableForeground(color);
|
|
49
|
+
const hover = mix(color, foreground === "#FFFFFF" ? "#000000" : "#FFFFFF", 0.08);
|
|
50
|
+
const soft = mix(normalizedSurface, color, 0.1);
|
|
51
|
+
return { color, foreground, hover, soft, softForeground: readableAccent(color, soft) };
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
contrastRatio,
|
|
55
|
+
createAccentPalette,
|
|
56
|
+
normalizeHex
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=colorPreview.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/design_system/gallery/components/colorPreview.ts"],
|
|
4
|
+
"sourcesContent": ["type Rgb = [number, number, number]\n\nexport function normalizeHex(input: string): string | null {\n const value = input.trim().replace(/^#/, '')\n if (/^[\\da-f]{3}$/i.test(value)) {\n return `#${[...value].map((digit) => digit.repeat(2)).join('').toUpperCase()}`\n }\n return /^[\\da-f]{6}$/i.test(value) ? `#${value.toUpperCase()}` : null\n}\n\nfunction channels(hex: string): Rgb {\n return [\n Number.parseInt(hex.slice(1, 3), 16),\n Number.parseInt(hex.slice(3, 5), 16),\n Number.parseInt(hex.slice(5, 7), 16),\n ]\n}\n\nfunction luminance(hex: string): number {\n const linear = channels(hex).map((channel) => {\n const normalized = channel / 255\n return normalized <= 0.04045 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4\n })\n return linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722\n}\n\nexport function contrastRatio(first: string, second: string): number {\n const normalizedFirst = normalizeHex(first)\n const normalizedSecond = normalizeHex(second)\n if (!normalizedFirst || !normalizedSecond) return 1\n const firstLuminance = luminance(normalizedFirst)\n const secondLuminance = luminance(normalizedSecond)\n return (Math.max(firstLuminance, secondLuminance) + 0.05) / (Math.min(firstLuminance, secondLuminance) + 0.05)\n}\n\nfunction mix(color: string, target: string, amount: number): string {\n const targetChannels = channels(target)\n return `#${channels(color).map((channel, index) => (\n Math.round(channel + (targetChannels[index] - channel) * amount).toString(16).padStart(2, '0')\n )).join('').toUpperCase()}`\n}\n\nfunction readableForeground(background: string): string {\n return contrastRatio(background, '#000000') >= contrastRatio(background, '#FFFFFF') ? '#000000' : '#FFFFFF'\n}\n\nfunction readableAccent(color: string, surface: string): string {\n const target = readableForeground(surface)\n for (let step = 0; step <= 20; step += 1) {\n const candidate = mix(color, target, step / 20)\n if (contrastRatio(candidate, surface) >= 4.5) return candidate\n }\n return target\n}\n\nexport function createAccentPalette(hex: string, surface: string) {\n const color = normalizeHex(hex) ?? '#000000'\n const normalizedSurface = normalizeHex(surface) ?? '#FFFFFF'\n const foreground = readableForeground(color)\n const hover = mix(color, foreground === '#FFFFFF' ? '#000000' : '#FFFFFF', 0.08)\n const soft = mix(normalizedSurface, color, 0.1)\n return { color, foreground, hover, soft, softForeground: readableAccent(color, soft) }\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAAS,aAAa,OAA8B;AACzD,QAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC3C,MAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,WAAO,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC;AAAA,EAC9E;AACA,SAAO,gBAAgB,KAAK,KAAK,IAAI,IAAI,MAAM,YAAY,CAAC,KAAK;AACnE;AAEA,SAAS,SAAS,KAAkB;AAClC,SAAO;AAAA,IACL,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACnC,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACnC,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EACrC;AACF;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,SAAS,SAAS,GAAG,EAAE,IAAI,CAAC,YAAY;AAC5C,UAAM,aAAa,UAAU;AAC7B,WAAO,cAAc,UAAU,aAAa,UAAU,aAAa,SAAS,UAAU;AAAA,EACxF,CAAC;AACD,SAAO,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI;AAC/D;AAEO,SAAS,cAAc,OAAe,QAAwB;AACnE,QAAM,kBAAkB,aAAa,KAAK;AAC1C,QAAM,mBAAmB,aAAa,MAAM;AAC5C,MAAI,CAAC,mBAAmB,CAAC,iBAAkB,QAAO;AAClD,QAAM,iBAAiB,UAAU,eAAe;AAChD,QAAM,kBAAkB,UAAU,gBAAgB;AAClD,UAAQ,KAAK,IAAI,gBAAgB,eAAe,IAAI,SAAS,KAAK,IAAI,gBAAgB,eAAe,IAAI;AAC3G;AAEA,SAAS,IAAI,OAAe,QAAgB,QAAwB;AAClE,QAAM,iBAAiB,SAAS,MAAM;AACtC,SAAO,IAAI,SAAS,KAAK,EAAE,IAAI,CAAC,SAAS,UACvC,KAAK,MAAM,WAAW,eAAe,KAAK,IAAI,WAAW,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAC9F,EAAE,KAAK,EAAE,EAAE,YAAY,CAAC;AAC3B;AAEA,SAAS,mBAAmB,YAA4B;AACtD,SAAO,cAAc,YAAY,SAAS,KAAK,cAAc,YAAY,SAAS,IAAI,YAAY;AACpG;AAEA,SAAS,eAAe,OAAe,SAAyB;AAC9D,QAAM,SAAS,mBAAmB,OAAO;AACzC,WAAS,OAAO,GAAG,QAAQ,IAAI,QAAQ,GAAG;AACxC,UAAM,YAAY,IAAI,OAAO,QAAQ,OAAO,EAAE;AAC9C,QAAI,cAAc,WAAW,OAAO,KAAK,IAAK,QAAO;AAAA,EACvD;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,KAAa,SAAiB;AAChE,QAAM,QAAQ,aAAa,GAAG,KAAK;AACnC,QAAM,oBAAoB,aAAa,OAAO,KAAK;AACnD,QAAM,aAAa,mBAAmB,KAAK;AAC3C,QAAM,QAAQ,IAAI,OAAO,eAAe,YAAY,YAAY,WAAW,IAAI;AAC/E,QAAM,OAAO,IAAI,mBAAmB,OAAO,GAAG;AAC9C,SAAO,EAAE,OAAO,YAAY,OAAO,MAAM,gBAAgB,eAAe,OAAO,IAAI,EAAE;AACvF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|