@reddb-io/ui-kit 0.3.4 → 0.3.5
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/package.json +11 -13
- package/src/lib/Badge.svelte +7 -27
- package/src/lib/Button.svelte +10 -33
- package/src/lib/Card.svelte +5 -20
- package/src/lib/EmptyState.svelte +5 -26
- package/src/lib/ListRow.svelte +14 -49
- package/src/lib/NodeBadge.svelte +6 -14
- package/src/lib/Pill.svelte +7 -25
- package/src/lib/SectionHeading.svelte +7 -20
- package/src/lib/index.ts +7 -18
- package/src/lib/tone.ts +11 -0
- package/src/tokens/index.ts +40 -17
- package/src/tokens/styles.css +4 -0
- package/src/tokens/tokens.css +68 -89
- package/vendor/ds/assets/fonts/jetbrains-mono-variable.woff2 +0 -0
- package/vendor/ds/assets/fonts/space-grotesk-variable.woff2 +0 -0
- package/vendor/ds/assets/fonts.css +38 -0
- package/vendor/ds/design-system.receipt.json +871 -0
- package/vendor/ds/kits/app/README.md +601 -0
- package/vendor/ds/kits/app/interaction-allowlist.json +35 -0
- package/vendor/ds/kits/app/kit.json +5 -0
- package/vendor/ds/kits/app/src/composites/ActionPanel.svelte +66 -0
- package/vendor/ds/kits/app/src/composites/ActivityFeed.svelte +29 -0
- package/vendor/ds/kits/app/src/composites/ApplicationShell.svelte +99 -0
- package/vendor/ds/kits/app/src/composites/BottomNavigation.svelte +68 -0
- package/vendor/ds/kits/app/src/composites/CardHeading.svelte +44 -0
- package/vendor/ds/kits/app/src/composites/CategoryFilter.svelte +83 -0
- package/vendor/ds/kits/app/src/composites/CategoryPreview.svelte +45 -0
- package/vendor/ds/kits/app/src/composites/ChatMessage.svelte +53 -0
- package/vendor/ds/kits/app/src/composites/CheckoutForm.svelte +91 -0
- package/vendor/ds/kits/app/src/composites/CommandPalette.svelte +80 -0
- package/vendor/ds/kits/app/src/composites/ContextMenu.svelte +138 -0
- package/vendor/ds/kits/app/src/composites/Diff.svelte +146 -0
- package/vendor/ds/kits/app/src/composites/EntityInspector.svelte +40 -0
- package/vendor/ds/kits/app/src/composites/EntityJourney.svelte +60 -0
- package/vendor/ds/kits/app/src/composites/Filter.svelte +42 -0
- package/vendor/ds/kits/app/src/composites/Incentive.svelte +61 -0
- package/vendor/ds/kits/app/src/composites/Menubar.svelte +121 -0
- package/vendor/ds/kits/app/src/composites/MultiColumnLayout.svelte +51 -0
- package/vendor/ds/kits/app/src/composites/OrderHistory.svelte +70 -0
- package/vendor/ds/kits/app/src/composites/OrderSummary.svelte +60 -0
- package/vendor/ds/kits/app/src/composites/PageHeading.svelte +46 -0
- package/vendor/ds/kits/app/src/composites/PhaseSummary.svelte +38 -0
- package/vendor/ds/kits/app/src/composites/PlaybackControls.svelte +62 -0
- package/vendor/ds/kits/app/src/composites/ProductFeature.svelte +71 -0
- package/vendor/ds/kits/app/src/composites/ProductList.svelte +74 -0
- package/vendor/ds/kits/app/src/composites/ProductOverview.svelte +77 -0
- package/vendor/ds/kits/app/src/composites/ProductQuickview.svelte +62 -0
- package/vendor/ds/kits/app/src/composites/PropertyPanel.svelte +42 -0
- package/vendor/ds/kits/app/src/composites/Review.svelte +68 -0
- package/vendor/ds/kits/app/src/composites/SettingsRow.svelte +38 -0
- package/vendor/ds/kits/app/src/composites/ShoppingCart.svelte +136 -0
- package/vendor/ds/kits/app/src/composites/SidebarLayout.svelte +349 -0
- package/vendor/ds/kits/app/src/composites/SidebarNavigation.svelte +74 -0
- package/vendor/ds/kits/app/src/composites/SidebarPanel.svelte +50 -0
- package/vendor/ds/kits/app/src/composites/SidebarRail.svelte +162 -0
- package/vendor/ds/kits/app/src/composites/SpeedDial.svelte +67 -0
- package/vendor/ds/kits/app/src/composites/StoreNavigation.svelte +53 -0
- package/vendor/ds/kits/app/src/composites/TaskCard.svelte +71 -0
- package/vendor/ds/kits/app/src/composites/TaskList.svelte +52 -0
- package/vendor/ds/kits/app/src/composites/TelemetryRow.svelte +41 -0
- package/vendor/ds/kits/app/src/composites/Toolbar.svelte +67 -0
- package/vendor/ds/kits/app/src/composites/action-panel.variants.ts +12 -0
- package/vendor/ds/kits/app/src/composites/activity-feed.variants.ts +10 -0
- package/vendor/ds/kits/app/src/composites/application-shell.behavior.ts +25 -0
- package/vendor/ds/kits/app/src/composites/application-shell.variants.ts +35 -0
- package/vendor/ds/kits/app/src/composites/bottom-navigation.variants.ts +20 -0
- package/vendor/ds/kits/app/src/composites/card-heading.variants.ts +7 -0
- package/vendor/ds/kits/app/src/composites/category-filter.variants.ts +22 -0
- package/vendor/ds/kits/app/src/composites/category-preview.variants.ts +21 -0
- package/vendor/ds/kits/app/src/composites/chat-message.variants.ts +16 -0
- package/vendor/ds/kits/app/src/composites/checkout-form.appearance.ts +19 -0
- package/vendor/ds/kits/app/src/composites/checkout-form.variants.ts +7 -0
- package/vendor/ds/kits/app/src/composites/command-palette.behavior.ts +11 -0
- package/vendor/ds/kits/app/src/composites/command-palette.variants.ts +15 -0
- package/vendor/ds/kits/app/src/composites/command-surfaces.behavior.ts +24 -0
- package/vendor/ds/kits/app/src/composites/context-menu.variants.ts +19 -0
- package/vendor/ds/kits/app/src/composites/diff.variants.ts +31 -0
- package/vendor/ds/kits/app/src/composites/filter.variants.ts +21 -0
- package/vendor/ds/kits/app/src/composites/incentive.variants.ts +18 -0
- package/vendor/ds/kits/app/src/composites/main-landmark.ts +23 -0
- package/vendor/ds/kits/app/src/composites/menubar.variants.ts +18 -0
- package/vendor/ds/kits/app/src/composites/multi-column-layout.variants.ts +39 -0
- package/vendor/ds/kits/app/src/composites/navigation.behavior.ts +84 -0
- package/vendor/ds/kits/app/src/composites/order-history.variants.ts +38 -0
- package/vendor/ds/kits/app/src/composites/order-summary.variants.ts +23 -0
- package/vendor/ds/kits/app/src/composites/page-heading.variants.ts +22 -0
- package/vendor/ds/kits/app/src/composites/product-feature.variants.ts +37 -0
- package/vendor/ds/kits/app/src/composites/product-list.behavior.ts +4 -0
- package/vendor/ds/kits/app/src/composites/product-list.variants.ts +35 -0
- package/vendor/ds/kits/app/src/composites/product-overview.variants.ts +23 -0
- package/vendor/ds/kits/app/src/composites/product-quickview.variants.ts +21 -0
- package/vendor/ds/kits/app/src/composites/review.variants.ts +17 -0
- package/vendor/ds/kits/app/src/composites/settings-row.variants.ts +17 -0
- package/vendor/ds/kits/app/src/composites/shopping-cart.appearance.ts +32 -0
- package/vendor/ds/kits/app/src/composites/shopping-cart.variants.ts +5 -0
- package/vendor/ds/kits/app/src/composites/sidebar-layout.variants.ts +211 -0
- package/vendor/ds/kits/app/src/composites/sidebar-navigation.variants.ts +12 -0
- package/vendor/ds/kits/app/src/composites/sidebar-panel.variants.ts +13 -0
- package/vendor/ds/kits/app/src/composites/sidebar-rail.variants.ts +58 -0
- package/vendor/ds/kits/app/src/composites/speed-dial.variants.ts +22 -0
- package/vendor/ds/kits/app/src/composites/store-navigation.variants.ts +15 -0
- package/vendor/ds/kits/app/src/composites/task-list.behavior.ts +51 -0
- package/vendor/ds/kits/app/src/composites/task-list.variants.ts +18 -0
- package/vendor/ds/kits/app/src/composites/toolbar.variants.ts +27 -0
- package/vendor/ds/kits/app/src/core/category-filter.ts +4 -0
- package/vendor/ds/kits/app/src/core/checkout-form.ts +22 -0
- package/vendor/ds/kits/app/src/core/contracts/actionpanel.ts +24 -0
- package/vendor/ds/kits/app/src/core/contracts/activityfeed.ts +10 -0
- package/vendor/ds/kits/app/src/core/contracts/applicationshell.ts +17 -0
- package/vendor/ds/kits/app/src/core/contracts/bottomnavigation.ts +20 -0
- package/vendor/ds/kits/app/src/core/contracts/cardheading.ts +15 -0
- package/vendor/ds/kits/app/src/core/contracts/categoryfilter.ts +21 -0
- package/vendor/ds/kits/app/src/core/contracts/categorypreview.ts +18 -0
- package/vendor/ds/kits/app/src/core/contracts/chatmessage.ts +18 -0
- package/vendor/ds/kits/app/src/core/contracts/checkoutform.ts +18 -0
- package/vendor/ds/kits/app/src/core/contracts/commandpalette.ts +24 -0
- package/vendor/ds/kits/app/src/core/contracts/contextmenu.ts +30 -0
- package/vendor/ds/kits/app/src/core/contracts/diff.ts +18 -0
- package/vendor/ds/kits/app/src/core/contracts/entityinspector.ts +25 -0
- package/vendor/ds/kits/app/src/core/contracts/entityjourney.ts +14 -0
- package/vendor/ds/kits/app/src/core/contracts/filter.ts +22 -0
- package/vendor/ds/kits/app/src/core/contracts/incentive.ts +11 -0
- package/vendor/ds/kits/app/src/core/contracts/listrow.ts +15 -0
- package/vendor/ds/kits/app/src/core/contracts/menubar.ts +28 -0
- package/vendor/ds/kits/app/src/core/contracts/multicolumnlayout.ts +7 -0
- package/vendor/ds/kits/app/src/core/contracts/navitem.ts +17 -0
- package/vendor/ds/kits/app/src/core/contracts/nodebadge.ts +11 -0
- package/vendor/ds/kits/app/src/core/contracts/orderhistory.ts +25 -0
- package/vendor/ds/kits/app/src/core/contracts/ordersummary.ts +19 -0
- package/vendor/ds/kits/app/src/core/contracts/pageheading.ts +9 -0
- package/vendor/ds/kits/app/src/core/contracts/phasesummary.ts +9 -0
- package/vendor/ds/kits/app/src/core/contracts/pill.ts +17 -0
- package/vendor/ds/kits/app/src/core/contracts/playbackcontrols.ts +20 -0
- package/vendor/ds/kits/app/src/core/contracts/productfeature.ts +14 -0
- package/vendor/ds/kits/app/src/core/contracts/productlist.ts +17 -0
- package/vendor/ds/kits/app/src/core/contracts/productoverview.ts +20 -0
- package/vendor/ds/kits/app/src/core/contracts/productquickview.ts +16 -0
- package/vendor/ds/kits/app/src/core/contracts/propertypanel.ts +9 -0
- package/vendor/ds/kits/app/src/core/contracts/review.ts +22 -0
- package/vendor/ds/kits/app/src/core/contracts/settingsrow.ts +13 -0
- package/vendor/ds/kits/app/src/core/contracts/shoppingcart.ts +29 -0
- package/vendor/ds/kits/app/src/core/contracts/sidebarlayout.ts +40 -0
- package/vendor/ds/kits/app/src/core/contracts/sidebarnavigation.ts +16 -0
- package/vendor/ds/kits/app/src/core/contracts/sidebarpanel.ts +22 -0
- package/vendor/ds/kits/app/src/core/contracts/sidebarrail.ts +13 -0
- package/vendor/ds/kits/app/src/core/contracts/speeddial.ts +32 -0
- package/vendor/ds/kits/app/src/core/contracts/splitview.ts +15 -0
- package/vendor/ds/kits/app/src/core/contracts/storenavigation.ts +20 -0
- package/vendor/ds/kits/app/src/core/contracts/taskcard.ts +7 -0
- package/vendor/ds/kits/app/src/core/contracts/tasklist.ts +13 -0
- package/vendor/ds/kits/app/src/core/contracts/telemetryrow.ts +17 -0
- package/vendor/ds/kits/app/src/core/contracts/toolbar.ts +25 -0
- package/vendor/ds/kits/app/src/core/diff.ts +7 -0
- package/vendor/ds/kits/app/src/core/entity-inspector.ts +26 -0
- package/vendor/ds/kits/app/src/core/entity-journey.ts +52 -0
- package/vendor/ds/kits/app/src/core/measure.ts +7 -0
- package/vendor/ds/kits/app/src/core/operational.ts +42 -0
- package/vendor/ds/kits/app/src/core/product-list.ts +16 -0
- package/vendor/ds/kits/app/src/core/settings-row.ts +9 -0
- package/vendor/ds/kits/app/src/core/shopping-cart.ts +17 -0
- package/vendor/ds/kits/app/src/core/sidebar-rail.ts +58 -0
- package/vendor/ds/kits/app/src/entity-inspector.variants.ts +14 -0
- package/vendor/ds/kits/app/src/entity-journey.variants.ts +38 -0
- package/vendor/ds/kits/app/src/index.ts +429 -0
- package/vendor/ds/kits/app/src/operational.variants.ts +20 -0
- package/vendor/ds/kits/app/src/primitives/ListRow.svelte +95 -0
- package/vendor/ds/kits/app/src/primitives/NavItem.svelte +87 -0
- package/vendor/ds/kits/app/src/primitives/NodeBadge.svelte +47 -0
- package/vendor/ds/kits/app/src/primitives/Pill.svelte +81 -0
- package/vendor/ds/kits/app/src/primitives/SplitView.svelte +148 -0
- package/vendor/ds/kits/app/src/primitives/list-row.variants.ts +82 -0
- package/vendor/ds/kits/app/src/primitives/nav-item.variants.ts +56 -0
- package/vendor/ds/kits/app/src/primitives/node-badge.variants.ts +73 -0
- package/vendor/ds/kits/app/src/primitives/pill.variants.ts +117 -0
- package/vendor/ds/kits/app/src/primitives/split-view.behavior.ts +113 -0
- package/vendor/ds/kits/app/src/primitives/split-view.variants.ts +60 -0
- package/vendor/ds/kits/app/src/recipes.ts +44 -0
- package/vendor/ds/kits/app/svelte.config.js +6 -0
- package/vendor/ds/kits/app/test/action-panel.test.ts +63 -0
- package/vendor/ds/kits/app/test/activity-feed.test.ts +74 -0
- package/vendor/ds/kits/app/test/application-shell.test.ts +147 -0
- package/vendor/ds/kits/app/test/base-contraction.test.ts +60 -0
- package/vendor/ds/kits/app/test/button-migration.test.ts +134 -0
- package/vendor/ds/kits/app/test/card-heading.test.ts +53 -0
- package/vendor/ds/kits/app/test/category-filter.test.ts +84 -0
- package/vendor/ds/kits/app/test/category-preview.test.ts +75 -0
- package/vendor/ds/kits/app/test/chat-message.test.ts +70 -0
- package/vendor/ds/kits/app/test/checkout-form.test.ts +134 -0
- package/vendor/ds/kits/app/test/coherence.test.ts +193 -0
- package/vendor/ds/kits/app/test/command-palette.test.ts +177 -0
- package/vendor/ds/kits/app/test/command-surface-failures.test.ts +28 -0
- package/vendor/ds/kits/app/test/commerce-readiness.ts +54 -0
- package/vendor/ds/kits/app/test/consumer-check.test.ts +61 -0
- package/vendor/ds/kits/app/test/context-menu.test.ts +96 -0
- package/vendor/ds/kits/app/test/density.test.ts +487 -0
- package/vendor/ds/kits/app/test/diff.test.ts +121 -0
- package/vendor/ds/kits/app/test/elevation.test.ts +77 -0
- package/vendor/ds/kits/app/test/entity-inspector.test.ts +97 -0
- package/vendor/ds/kits/app/test/entity-journey.test.ts +100 -0
- package/vendor/ds/kits/app/test/event-dialect.test.ts +183 -0
- package/vendor/ds/kits/app/test/filter.test.ts +161 -0
- package/vendor/ds/kits/app/test/fixtures/ApplicationLayoutsConsumer.svelte +26 -0
- package/vendor/ds/kits/app/test/fixtures/ApplicationLayoutsContractFailures.svelte +19 -0
- package/vendor/ds/kits/app/test/fixtures/CommandPaletteConsumer.svelte +22 -0
- package/vendor/ds/kits/app/test/fixtures/CommandPaletteContractFailures.svelte +20 -0
- package/vendor/ds/kits/app/test/fixtures/CommandSurfaceContractFailures.svelte +24 -0
- package/vendor/ds/kits/app/test/fixtures/CommerceContractFailures.svelte +17 -0
- package/vendor/ds/kits/app/test/fixtures/CommerceSurfacesConsumer.svelte +30 -0
- package/vendor/ds/kits/app/test/fixtures/DiffConsumer.svelte +18 -0
- package/vendor/ds/kits/app/test/fixtures/DiffContractFailures.svelte +5 -0
- package/vendor/ds/kits/app/test/fixtures/EntityInspector.svelte +7 -0
- package/vendor/ds/kits/app/test/fixtures/EntityJourney.svelte +11 -0
- package/vendor/ds/kits/app/test/fixtures/FilterContractFailures.svelte +16 -0
- package/vendor/ds/kits/app/test/fixtures/FilterSurfacesConsumer.svelte +24 -0
- package/vendor/ds/kits/app/test/fixtures/FrameworkApp.svelte +28 -0
- package/vendor/ds/kits/app/test/fixtures/HeadingContractFailures.svelte +10 -0
- package/vendor/ds/kits/app/test/fixtures/MainOwnershipConsumer.svelte +35 -0
- package/vendor/ds/kits/app/test/fixtures/MerchandisingContractFailures.svelte +3 -0
- package/vendor/ds/kits/app/test/fixtures/MerchandisingSurfacesConsumer.svelte +28 -0
- package/vendor/ds/kits/app/test/fixtures/NavigationContractFailures.svelte +22 -0
- package/vendor/ds/kits/app/test/fixtures/NavigationSurfacesConsumer.svelte +23 -0
- package/vendor/ds/kits/app/test/fixtures/NestedSplitViewConsumer.svelte +20 -0
- package/vendor/ds/kits/app/test/fixtures/Operational.svelte +34 -0
- package/vendor/ds/kits/app/test/fixtures/ProductCatalogueConsumer.svelte +58 -0
- package/vendor/ds/kits/app/test/fixtures/ProductCatalogueContractFailures.svelte +29 -0
- package/vendor/ds/kits/app/test/fixtures/SettingsRows.svelte +10 -0
- package/vendor/ds/kits/app/test/fixtures/ShellBrandComposition.svelte +52 -0
- package/vendor/ds/kits/app/test/fixtures/SocialContractFailures.svelte +20 -0
- package/vendor/ds/kits/app/test/fixtures/SocialSurfacesConsumer.svelte +43 -0
- package/vendor/ds/kits/app/test/fixtures/TestGlyph.svelte +9 -0
- package/vendor/ds/kits/app/test/fixtures/TitlingSurfacesConsumer.svelte +21 -0
- package/vendor/ds/kits/app/test/fixtures/command-surfaces-consumer.ts +14 -0
- package/vendor/ds/kits/app/test/fixtures/consumer-check/Unfixed.svelte +50 -0
- package/vendor/ds/kits/app/test/fixtures/consumer-check/tsconfig.json +4 -0
- package/vendor/ds/kits/app/test/fixtures/markers/fixture-badge.variants.ts +12 -0
- package/vendor/ds/kits/app/test/fixtures/markers/fixture-chip.variants.ts +8 -0
- package/vendor/ds/kits/app/test/fixtures/tree-shaking/button-only.ts +7 -0
- package/vendor/ds/kits/app/test/fixtures/tree-shaking/menu-only.ts +9 -0
- package/vendor/ds/kits/app/test/fixtures/tree-shaking/number-field-only.ts +1 -0
- package/vendor/ds/kits/app/test/fixtures/tree-shaking/task-list-only.ts +1 -0
- package/vendor/ds/kits/app/test/framework-app.test.ts +140 -0
- package/vendor/ds/kits/app/test/framework-operational.test.ts +97 -0
- package/vendor/ds/kits/app/test/heading-level.test.ts +38 -0
- package/vendor/ds/kits/app/test/incentive.test.ts +60 -0
- package/vendor/ds/kits/app/test/label-in-name.ts +43 -0
- package/vendor/ds/kits/app/test/layout-readiness.ts +49 -0
- package/vendor/ds/kits/app/test/lint.test.ts +54 -0
- package/vendor/ds/kits/app/test/list-row.test.ts +117 -0
- package/vendor/ds/kits/app/test/main-ownership.test.ts +56 -0
- package/vendor/ds/kits/app/test/markers.test.ts +94 -0
- package/vendor/ds/kits/app/test/markers.ts +94 -0
- package/vendor/ds/kits/app/test/menubar.test.ts +93 -0
- package/vendor/ds/kits/app/test/mount.ts +86 -0
- package/vendor/ds/kits/app/test/multi-column-layout.test.ts +106 -0
- package/vendor/ds/kits/app/test/nav-item.test.ts +125 -0
- package/vendor/ds/kits/app/test/navigation-markers.test.ts +31 -0
- package/vendor/ds/kits/app/test/node-badge.test.ts +81 -0
- package/vendor/ds/kits/app/test/order-history.test.ts +78 -0
- package/vendor/ds/kits/app/test/order-summary.test.ts +77 -0
- package/vendor/ds/kits/app/test/page-heading.test.ts +90 -0
- package/vendor/ds/kits/app/test/pill.test.ts +63 -0
- package/vendor/ds/kits/app/test/product-feature.test.ts +76 -0
- package/vendor/ds/kits/app/test/product-list.test.ts +95 -0
- package/vendor/ds/kits/app/test/product-overview.test.ts +92 -0
- package/vendor/ds/kits/app/test/product-quickview.test.ts +116 -0
- package/vendor/ds/kits/app/test/react-consumer.tsx +36 -0
- package/vendor/ds/kits/app/test/review.test.ts +84 -0
- package/vendor/ds/kits/app/test/settings-row.test.ts +34 -0
- package/vendor/ds/kits/app/test/shell-brand.test.ts +22 -0
- package/vendor/ds/kits/app/test/shopping-cart.test.ts +172 -0
- package/vendor/ds/kits/app/test/sidebar-layout.test.ts +133 -0
- package/vendor/ds/kits/app/test/sidebar-navigation-bottom-navigation-store-navigation.test.ts +245 -0
- package/vendor/ds/kits/app/test/sidebar-panel.test.ts +29 -0
- package/vendor/ds/kits/app/test/sidebar-rail.test.ts +320 -0
- package/vendor/ds/kits/app/test/speed-dial.test.ts +53 -0
- package/vendor/ds/kits/app/test/split-view.behavior.test.ts +137 -0
- package/vendor/ds/kits/app/test/split-view.dense-tooling.test.ts +66 -0
- package/vendor/ds/kits/app/test/split-view.test.ts +210 -0
- package/vendor/ds/kits/app/test/task-list.test.ts +26 -0
- package/vendor/ds/kits/app/test/taxonomy.test.ts +149 -0
- package/vendor/ds/kits/app/test/toolbar.test.ts +42 -0
- package/vendor/ds/kits/app/test/tree-shaking.test.ts +381 -0
- package/vendor/ds/kits/app/test/vocabulary.test.ts +182 -0
- package/vendor/ds/kits/app/tools/build-cli.ts +34 -0
- package/vendor/ds/kits/app/tools/check-cli.ts +33 -0
- package/vendor/ds/kits/app/tools/consumer-check.ts +117 -0
- package/vendor/ds/kits/app/tools/lint-cli.ts +19 -0
- package/vendor/ds/kits/app/tools/paths.ts +47 -0
- package/vendor/ds/kits/app/tsconfig.consumer.json +30 -0
- package/vendor/ds/kits/app/tsconfig.json +26 -0
- package/vendor/ds/kits/app/type-ledger.json +4 -0
- package/vendor/ds/kits/app/vite.config.ts +28 -0
- package/vendor/ds/kits/base/README.md +1482 -0
- package/vendor/ds/kits/base/interaction-allowlist.json +106 -0
- package/vendor/ds/kits/base/kit.json +4 -0
- package/vendor/ds/kits/base/src/Accordion.svelte +113 -0
- package/vendor/ds/kits/base/src/Alert.svelte +51 -0
- package/vendor/ds/kits/base/src/AlertDialog.svelte +77 -0
- package/vendor/ds/kits/base/src/AppearanceSwitch.svelte +73 -0
- package/vendor/ds/kits/base/src/AspectRatio.svelte +32 -0
- package/vendor/ds/kits/base/src/Avatar.svelte +75 -0
- package/vendor/ds/kits/base/src/Badge.svelte +63 -0
- package/vendor/ds/kits/base/src/Breadcrumbs.svelte +57 -0
- package/vendor/ds/kits/base/src/BrowserMockup.svelte +53 -0
- package/vendor/ds/kits/base/src/BulletsSlide.svelte +60 -0
- package/vendor/ds/kits/base/src/Button.svelte +123 -0
- package/vendor/ds/kits/base/src/Calendar.svelte +156 -0
- package/vendor/ds/kits/base/src/Card.svelte +213 -0
- package/vendor/ds/kits/base/src/Carousel.svelte +172 -0
- package/vendor/ds/kits/base/src/Checkbox.svelte +99 -0
- package/vendor/ds/kits/base/src/CodeBlock.svelte +113 -0
- package/vendor/ds/kits/base/src/Combobox.svelte +124 -0
- package/vendor/ds/kits/base/src/Container.svelte +29 -0
- package/vendor/ds/kits/base/src/ContentMask.svelte +32 -0
- package/vendor/ds/kits/base/src/ControlGroup.svelte +42 -0
- package/vendor/ds/kits/base/src/Countdown.svelte +55 -0
- package/vendor/ds/kits/base/src/DateField.svelte +157 -0
- package/vendor/ds/kits/base/src/DatePicker.svelte +112 -0
- package/vendor/ds/kits/base/src/DateRangeField.svelte +81 -0
- package/vendor/ds/kits/base/src/DateRangePicker.svelte +137 -0
- package/vendor/ds/kits/base/src/Deck.svelte +24 -0
- package/vendor/ds/kits/base/src/DescriptionList.svelte +40 -0
- package/vendor/ds/kits/base/src/Dialog.svelte +143 -0
- package/vendor/ds/kits/base/src/Disclosure.svelte +85 -0
- package/vendor/ds/kits/base/src/Divider.svelte +22 -0
- package/vendor/ds/kits/base/src/Drawer.svelte +17 -0
- package/vendor/ds/kits/base/src/DropdownMenu.svelte +192 -0
- package/vendor/ds/kits/base/src/EmptyState.svelte +54 -0
- package/vendor/ds/kits/base/src/Eyebrow.svelte +21 -0
- package/vendor/ds/kits/base/src/Field.svelte +75 -0
- package/vendor/ds/kits/base/src/Fieldset.svelte +70 -0
- package/vendor/ds/kits/base/src/FigureSlide.svelte +70 -0
- package/vendor/ds/kits/base/src/FileInput.svelte +104 -0
- package/vendor/ds/kits/base/src/Form.svelte +21 -0
- package/vendor/ds/kits/base/src/GridList.svelte +51 -0
- package/vendor/ds/kits/base/src/Heading.svelte +41 -0
- package/vendor/ds/kits/base/src/Icon.svelte +75 -0
- package/vendor/ds/kits/base/src/Image.svelte +133 -0
- package/vendor/ds/kits/base/src/Indicator.svelte +35 -0
- package/vendor/ds/kits/base/src/InlineEdit.svelte +86 -0
- package/vendor/ds/kits/base/src/Input.svelte +84 -0
- package/vendor/ds/kits/base/src/Kbd.svelte +41 -0
- package/vendor/ds/kits/base/src/Label.svelte +21 -0
- package/vendor/ds/kits/base/src/Link.svelte +21 -0
- package/vendor/ds/kits/base/src/LinkPreview.svelte +95 -0
- package/vendor/ds/kits/base/src/List.svelte +28 -0
- package/vendor/ds/kits/base/src/ListContainer.svelte +51 -0
- package/vendor/ds/kits/base/src/LoadingIndicator.svelte +48 -0
- package/vendor/ds/kits/base/src/Logo.svelte +183 -0
- package/vendor/ds/kits/base/src/MediaObject.svelte +46 -0
- package/vendor/ds/kits/base/src/Meter.svelte +130 -0
- package/vendor/ds/kits/base/src/Navbar.svelte +176 -0
- package/vendor/ds/kits/base/src/NavigationMenu.svelte +124 -0
- package/vendor/ds/kits/base/src/NavigationScope.svelte +57 -0
- package/vendor/ds/kits/base/src/Notification.svelte +74 -0
- package/vendor/ds/kits/base/src/NumberField.svelte +104 -0
- package/vendor/ds/kits/base/src/OneTimeCodeInput.svelte +176 -0
- package/vendor/ds/kits/base/src/Pagination.svelte +40 -0
- package/vendor/ds/kits/base/src/PhoneInput.svelte +96 -0
- package/vendor/ds/kits/base/src/PhoneMockup.svelte +42 -0
- package/vendor/ds/kits/base/src/Popover.svelte +116 -0
- package/vendor/ds/kits/base/src/Progress.svelte +115 -0
- package/vendor/ds/kits/base/src/Prose.svelte +40 -0
- package/vendor/ds/kits/base/src/QuoteSlide.svelte +60 -0
- package/vendor/ds/kits/base/src/RadialProgress.svelte +85 -0
- package/vendor/ds/kits/base/src/RadioGroup.svelte +117 -0
- package/vendor/ds/kits/base/src/RangeCalendar.svelte +171 -0
- package/vendor/ds/kits/base/src/Rating.svelte +126 -0
- package/vendor/ds/kits/base/src/Reveal.svelte +36 -0
- package/vendor/ds/kits/base/src/ScrollArea.svelte +40 -0
- package/vendor/ds/kits/base/src/SearchSelect.svelte +203 -0
- package/vendor/ds/kits/base/src/SectionHeading.svelte +59 -0
- package/vendor/ds/kits/base/src/SectionSlide.svelte +56 -0
- package/vendor/ds/kits/base/src/Select.svelte +95 -0
- package/vendor/ds/kits/base/src/Skeleton.svelte +35 -0
- package/vendor/ds/kits/base/src/SkipLink.svelte +39 -0
- package/vendor/ds/kits/base/src/SlideFrame.svelte +63 -0
- package/vendor/ds/kits/base/src/Slider.svelte +107 -0
- package/vendor/ds/kits/base/src/Stack.svelte +57 -0
- package/vendor/ds/kits/base/src/Statistic.svelte +74 -0
- package/vendor/ds/kits/base/src/StatusIndicator.svelte +52 -0
- package/vendor/ds/kits/base/src/Steps.svelte +51 -0
- package/vendor/ds/kits/base/src/Swap.svelte +85 -0
- package/vendor/ds/kits/base/src/Switch.svelte +91 -0
- package/vendor/ds/kits/base/src/Table.svelte +96 -0
- package/vendor/ds/kits/base/src/Tabs.svelte +131 -0
- package/vendor/ds/kits/base/src/Text.svelte +45 -0
- package/vendor/ds/kits/base/src/Textarea.svelte +63 -0
- package/vendor/ds/kits/base/src/TimeField.svelte +118 -0
- package/vendor/ds/kits/base/src/TimeRangeField.svelte +81 -0
- package/vendor/ds/kits/base/src/Timeline.svelte +49 -0
- package/vendor/ds/kits/base/src/TitleSlide.svelte +63 -0
- package/vendor/ds/kits/base/src/ToggleButton.svelte +78 -0
- package/vendor/ds/kits/base/src/ToggleGroup.svelte +79 -0
- package/vendor/ds/kits/base/src/Tooltip.svelte +109 -0
- package/vendor/ds/kits/base/src/Transfer.svelte +31 -0
- package/vendor/ds/kits/base/src/TwoColumnSlide.svelte +63 -0
- package/vendor/ds/kits/base/src/WindowMockup.svelte +51 -0
- package/vendor/ds/kits/base/src/a11y.ts +21 -0
- package/vendor/ds/kits/base/src/accordion.variants.ts +26 -0
- package/vendor/ds/kits/base/src/alert-dialog.variants.ts +17 -0
- package/vendor/ds/kits/base/src/alert.variants.ts +36 -0
- package/vendor/ds/kits/base/src/appearance-switch.behavior.ts +29 -0
- package/vendor/ds/kits/base/src/aspect-ratio.variants.ts +14 -0
- package/vendor/ds/kits/base/src/avatar.variants.ts +29 -0
- package/vendor/ds/kits/base/src/badge.variants.ts +89 -0
- package/vendor/ds/kits/base/src/breadcrumbs.variants.ts +15 -0
- package/vendor/ds/kits/base/src/browser-mockup.variants.ts +18 -0
- package/vendor/ds/kits/base/src/button.variants.ts +186 -0
- package/vendor/ds/kits/base/src/calendar.variants.ts +35 -0
- package/vendor/ds/kits/base/src/card.variants.ts +293 -0
- package/vendor/ds/kits/base/src/carousel.variants.ts +19 -0
- package/vendor/ds/kits/base/src/checkbox.variants.ts +64 -0
- package/vendor/ds/kits/base/src/code-block.variants.ts +58 -0
- package/vendor/ds/kits/base/src/collapsible.style.ts +15 -0
- package/vendor/ds/kits/base/src/combobox.variants.ts +62 -0
- package/vendor/ds/kits/base/src/container.variants.ts +27 -0
- package/vendor/ds/kits/base/src/content-mask.variants.ts +57 -0
- package/vendor/ds/kits/base/src/control-group.variants.ts +22 -0
- package/vendor/ds/kits/base/src/core/a11y.ts +106 -0
- package/vendor/ds/kits/base/src/core/appearance-switch.ts +39 -0
- package/vendor/ds/kits/base/src/core/avatar.ts +27 -0
- package/vendor/ds/kits/base/src/core/breadcrumbs.ts +11 -0
- package/vendor/ds/kits/base/src/core/calendar.ts +95 -0
- package/vendor/ds/kits/base/src/core/carousel.ts +8 -0
- package/vendor/ds/kits/base/src/core/choices.ts +29 -0
- package/vendor/ds/kits/base/src/core/code-block.ts +23 -0
- package/vendor/ds/kits/base/src/core/confirmation.ts +24 -0
- package/vendor/ds/kits/base/src/core/contracts/accordion.ts +28 -0
- package/vendor/ds/kits/base/src/core/contracts/carousel.ts +23 -0
- package/vendor/ds/kits/base/src/core/contracts/combobox.ts +35 -0
- package/vendor/ds/kits/base/src/core/contracts/datefield.ts +23 -0
- package/vendor/ds/kits/base/src/core/contracts/datepicker.ts +62 -0
- package/vendor/ds/kits/base/src/core/contracts/daterangefield.ts +33 -0
- package/vendor/ds/kits/base/src/core/contracts/daterangepicker.ts +88 -0
- package/vendor/ds/kits/base/src/core/contracts/dialog.ts +24 -0
- package/vendor/ds/kits/base/src/core/contracts/disclosure.ts +15 -0
- package/vendor/ds/kits/base/src/core/contracts/linkpreview.ts +29 -0
- package/vendor/ds/kits/base/src/core/contracts/navbar.ts +30 -0
- package/vendor/ds/kits/base/src/core/contracts/navigationmenu.ts +35 -0
- package/vendor/ds/kits/base/src/core/contracts/phoneinput.ts +55 -0
- package/vendor/ds/kits/base/src/core/contracts/popover.ts +29 -0
- package/vendor/ds/kits/base/src/core/contracts/searchselect.ts +38 -0
- package/vendor/ds/kits/base/src/core/contracts/tabs.ts +26 -0
- package/vendor/ds/kits/base/src/core/contracts/timefield.ts +23 -0
- package/vendor/ds/kits/base/src/core/contracts/timerangefield.ts +33 -0
- package/vendor/ds/kits/base/src/core/contracts/tooltip.ts +12 -0
- package/vendor/ds/kits/base/src/core/contracts/transfer.ts +13 -0
- package/vendor/ds/kits/base/src/core/date-segments.ts +18 -0
- package/vendor/ds/kits/base/src/core/description-list.ts +5 -0
- package/vendor/ds/kits/base/src/core/dropdown-menu.ts +55 -0
- package/vendor/ds/kits/base/src/core/feedback.ts +5 -0
- package/vendor/ds/kits/base/src/core/field.ts +57 -0
- package/vendor/ds/kits/base/src/core/fieldset.ts +10 -0
- package/vendor/ds/kits/base/src/core/focus-scope.ts +27 -0
- package/vendor/ds/kits/base/src/core/icon.ts +15 -0
- package/vendor/ds/kits/base/src/core/index.ts +2 -0
- package/vendor/ds/kits/base/src/core/inline-edit.ts +86 -0
- package/vendor/ds/kits/base/src/core/input.ts +9 -0
- package/vendor/ds/kits/base/src/core/modal.ts +73 -0
- package/vendor/ds/kits/base/src/core/native-controls.ts +43 -0
- package/vendor/ds/kits/base/src/core/navbar.ts +16 -0
- package/vendor/ds/kits/base/src/core/navigation-disclosures.ts +10 -0
- package/vendor/ds/kits/base/src/core/navigation.ts +48 -0
- package/vendor/ds/kits/base/src/core/number-field.ts +8 -0
- package/vendor/ds/kits/base/src/core/one-time-code.ts +17 -0
- package/vendor/ds/kits/base/src/core/operational-motion.ts +174 -0
- package/vendor/ds/kits/base/src/core/pagination.ts +8 -0
- package/vendor/ds/kits/base/src/core/phone-input.ts +106 -0
- package/vendor/ds/kits/base/src/core/portal-appearance.ts +15 -0
- package/vendor/ds/kits/base/src/core/reveal.ts +60 -0
- package/vendor/ds/kits/base/src/core/segments.ts +28 -0
- package/vendor/ds/kits/base/src/core/skip-link.ts +7 -0
- package/vendor/ds/kits/base/src/core/slider.ts +23 -0
- package/vendor/ds/kits/base/src/core/steps.ts +12 -0
- package/vendor/ds/kits/base/src/core/table.ts +21 -0
- package/vendor/ds/kits/base/src/core/timeline.ts +14 -0
- package/vendor/ds/kits/base/src/core/toggle-group.ts +41 -0
- package/vendor/ds/kits/base/src/countdown.behavior.ts +26 -0
- package/vendor/ds/kits/base/src/countdown.variants.ts +11 -0
- package/vendor/ds/kits/base/src/date-field.variants.ts +24 -0
- package/vendor/ds/kits/base/src/date-picker.variants.ts +16 -0
- package/vendor/ds/kits/base/src/date-range-field.variants.ts +21 -0
- package/vendor/ds/kits/base/src/date-range-picker.variants.ts +15 -0
- package/vendor/ds/kits/base/src/deck.variants.ts +10 -0
- package/vendor/ds/kits/base/src/deprecation.ts +24 -0
- package/vendor/ds/kits/base/src/description-list.appearance.ts +32 -0
- package/vendor/ds/kits/base/src/description-list.variants.ts +6 -0
- package/vendor/ds/kits/base/src/dialog.variants.ts +30 -0
- package/vendor/ds/kits/base/src/disclosure.variants.ts +14 -0
- package/vendor/ds/kits/base/src/divider.variants.ts +17 -0
- package/vendor/ds/kits/base/src/drawer.variants.ts +48 -0
- package/vendor/ds/kits/base/src/dropdown-menu.behavior.ts +6 -0
- package/vendor/ds/kits/base/src/dropdown-menu.variants.ts +38 -0
- package/vendor/ds/kits/base/src/empty-state.variants.ts +41 -0
- package/vendor/ds/kits/base/src/eyebrow.variants.ts +14 -0
- package/vendor/ds/kits/base/src/field.variants.ts +54 -0
- package/vendor/ds/kits/base/src/fieldset.variants.ts +29 -0
- package/vendor/ds/kits/base/src/file-input.variants.ts +18 -0
- package/vendor/ds/kits/base/src/form.variants.ts +13 -0
- package/vendor/ds/kits/base/src/grid-list.variants.ts +38 -0
- package/vendor/ds/kits/base/src/heading.variants.ts +35 -0
- package/vendor/ds/kits/base/src/image.variants.ts +121 -0
- package/vendor/ds/kits/base/src/index.ts +1039 -0
- package/vendor/ds/kits/base/src/indicator.variants.ts +35 -0
- package/vendor/ds/kits/base/src/inline-edit.variants.ts +33 -0
- package/vendor/ds/kits/base/src/input.variants.ts +33 -0
- package/vendor/ds/kits/base/src/interaction.ts +3 -0
- package/vendor/ds/kits/base/src/kbd.variants.ts +25 -0
- package/vendor/ds/kits/base/src/label.variants.ts +8 -0
- package/vendor/ds/kits/base/src/link-preview.variants.ts +10 -0
- package/vendor/ds/kits/base/src/link.variants.ts +20 -0
- package/vendor/ds/kits/base/src/list.variants.ts +17 -0
- package/vendor/ds/kits/base/src/loading-indicator.variants.ts +31 -0
- package/vendor/ds/kits/base/src/logo.box.ts +128 -0
- package/vendor/ds/kits/base/src/logo.marks.ts +248 -0
- package/vendor/ds/kits/base/src/logo.surface.ts +45 -0
- package/vendor/ds/kits/base/src/logo.variants.ts +53 -0
- package/vendor/ds/kits/base/src/marks/reddb-horizontal-color.svg +14 -0
- package/vendor/ds/kits/base/src/marks/reddb-horizontal-inverse.svg +14 -0
- package/vendor/ds/kits/base/src/marks/reddb-icon-color.svg +5 -0
- package/vendor/ds/kits/base/src/marks/reddb-stacked-color.svg +16 -0
- package/vendor/ds/kits/base/src/marks/reddb-stacked-inverse.svg +16 -0
- package/vendor/ds/kits/base/src/marks/reddb-symbol-black.svg +5 -0
- package/vendor/ds/kits/base/src/marks/reddb-symbol-color.svg +5 -0
- package/vendor/ds/kits/base/src/marks/reddb-symbol-knockout.svg +4 -0
- package/vendor/ds/kits/base/src/marks/reddb-symbol-white.svg +5 -0
- package/vendor/ds/kits/base/src/marks/reddb-wordmark-black.svg +10 -0
- package/vendor/ds/kits/base/src/marks/reddb-wordmark-white.svg +10 -0
- package/vendor/ds/kits/base/src/media-object.variants.ts +29 -0
- package/vendor/ds/kits/base/src/meter.variants.ts +55 -0
- package/vendor/ds/kits/base/src/navbar.variants.ts +78 -0
- package/vendor/ds/kits/base/src/navigation-menu.behavior.ts +24 -0
- package/vendor/ds/kits/base/src/navigation-menu.variants.ts +39 -0
- package/vendor/ds/kits/base/src/navigation.ts +45 -0
- package/vendor/ds/kits/base/src/notification.variants.ts +14 -0
- package/vendor/ds/kits/base/src/number-field.variants.ts +10 -0
- package/vendor/ds/kits/base/src/one-time-code-input.variants.ts +23 -0
- package/vendor/ds/kits/base/src/pagination.variants.ts +19 -0
- package/vendor/ds/kits/base/src/phone-input.variants.ts +17 -0
- package/vendor/ds/kits/base/src/phone-mockup.variants.ts +16 -0
- package/vendor/ds/kits/base/src/popover.variants.ts +12 -0
- package/vendor/ds/kits/base/src/portal-appearance.svelte.ts +12 -0
- package/vendor/ds/kits/base/src/progress.behavior.ts +37 -0
- package/vendor/ds/kits/base/src/progress.variants.ts +31 -0
- package/vendor/ds/kits/base/src/prose.variants.ts +231 -0
- package/vendor/ds/kits/base/src/quiet-control.variants.ts +90 -0
- package/vendor/ds/kits/base/src/radial-progress.variants.ts +47 -0
- package/vendor/ds/kits/base/src/radio-group.variants.ts +59 -0
- package/vendor/ds/kits/base/src/rating.variants.ts +22 -0
- package/vendor/ds/kits/base/src/recipes.ts +100 -0
- package/vendor/ds/kits/base/src/reduced-motion.svelte.ts +40 -0
- package/vendor/ds/kits/base/src/reveal.variants.ts +43 -0
- package/vendor/ds/kits/base/src/scroll-area.variants.ts +29 -0
- package/vendor/ds/kits/base/src/search-select.variants.ts +39 -0
- package/vendor/ds/kits/base/src/section-heading.variants.ts +41 -0
- package/vendor/ds/kits/base/src/segments.variants.ts +8 -0
- package/vendor/ds/kits/base/src/select.variants.ts +30 -0
- package/vendor/ds/kits/base/src/skeleton.variants.ts +17 -0
- package/vendor/ds/kits/base/src/skip-link.variants.ts +17 -0
- package/vendor/ds/kits/base/src/slide-frame.variants.ts +94 -0
- package/vendor/ds/kits/base/src/slide-layout.variants.ts +43 -0
- package/vendor/ds/kits/base/src/slider.variants.ts +16 -0
- package/vendor/ds/kits/base/src/stack.variants.ts +65 -0
- package/vendor/ds/kits/base/src/statistic.variants.ts +12 -0
- package/vendor/ds/kits/base/src/status-indicator.variants.ts +52 -0
- package/vendor/ds/kits/base/src/steps.variants.ts +18 -0
- package/vendor/ds/kits/base/src/structured-data.ts +94 -0
- package/vendor/ds/kits/base/src/swap.variants.ts +13 -0
- package/vendor/ds/kits/base/src/switch.variants.ts +20 -0
- package/vendor/ds/kits/base/src/table.variants.ts +31 -0
- package/vendor/ds/kits/base/src/tabs.variants.ts +32 -0
- package/vendor/ds/kits/base/src/text.variants.ts +51 -0
- package/vendor/ds/kits/base/src/textarea.variants.ts +19 -0
- package/vendor/ds/kits/base/src/time-field.variants.ts +21 -0
- package/vendor/ds/kits/base/src/time-range-field.variants.ts +21 -0
- package/vendor/ds/kits/base/src/timeline.variants.ts +22 -0
- package/vendor/ds/kits/base/src/toggle-button.variants.ts +26 -0
- package/vendor/ds/kits/base/src/toggle-group.variants.ts +38 -0
- package/vendor/ds/kits/base/src/tone.ts +24 -0
- package/vendor/ds/kits/base/src/tooltip.variants.ts +14 -0
- package/vendor/ds/kits/base/src/transfer.variants.ts +5 -0
- package/vendor/ds/kits/base/src/type-roles.ts +22 -0
- package/vendor/ds/kits/base/src/window-mockup.variants.ts +18 -0
- package/vendor/ds/kits/base/svelte.config.js +6 -0
- package/vendor/ds/kits/base/test/accessible-name.test.ts +66 -0
- package/vendor/ds/kits/base/test/accordion.test.ts +81 -0
- package/vendor/ds/kits/base/test/alert-dialog.test.ts +81 -0
- package/vendor/ds/kits/base/test/alert.test.ts +75 -0
- package/vendor/ds/kits/base/test/appearance-switch.test.ts +124 -0
- package/vendor/ds/kits/base/test/avatar-media-object-carousel-failures.test.ts +25 -0
- package/vendor/ds/kits/base/test/avatar.test.ts +75 -0
- package/vendor/ds/kits/base/test/badge.test.ts +99 -0
- package/vendor/ds/kits/base/test/breadcrumbs.test.ts +45 -0
- package/vendor/ds/kits/base/test/browser-mockup.test.ts +57 -0
- package/vendor/ds/kits/base/test/browser-phone-window-mockup.test.ts +58 -0
- package/vendor/ds/kits/base/test/button.test.ts +340 -0
- package/vendor/ds/kits/base/test/calendar.test.ts +86 -0
- package/vendor/ds/kits/base/test/card-busy.test.ts +25 -0
- package/vendor/ds/kits/base/test/card-divider-aspect-ratio-failures.test.ts +29 -0
- package/vendor/ds/kits/base/test/card-divider-aspect-ratio.test.ts +201 -0
- package/vendor/ds/kits/base/test/card-media.test.ts +113 -0
- package/vendor/ds/kits/base/test/card-tone-api.test.ts +12 -0
- package/vendor/ds/kits/base/test/card-tone-contrast.test.ts +120 -0
- package/vendor/ds/kits/base/test/card-tone.test.ts +103 -0
- package/vendor/ds/kits/base/test/carousel.test.ts +63 -0
- package/vendor/ds/kits/base/test/checkbox.test.ts +165 -0
- package/vendor/ds/kits/base/test/code-block.test.ts +148 -0
- package/vendor/ds/kits/base/test/coherence.test.ts +124 -0
- package/vendor/ds/kits/base/test/combobox.test.ts +172 -0
- package/vendor/ds/kits/base/test/components.test.ts +113 -0
- package/vendor/ds/kits/base/test/consumer-check.test.ts +42 -0
- package/vendor/ds/kits/base/test/container-stack-skip-link-failures.test.ts +31 -0
- package/vendor/ds/kits/base/test/container.test.ts +41 -0
- package/vendor/ds/kits/base/test/content-mask-failures.test.ts +24 -0
- package/vendor/ds/kits/base/test/content-mask.test.ts +134 -0
- package/vendor/ds/kits/base/test/control-group.test.ts +51 -0
- package/vendor/ds/kits/base/test/control-size.test.ts +60 -0
- package/vendor/ds/kits/base/test/countdown.test.ts +70 -0
- package/vendor/ds/kits/base/test/date-field.test.ts +126 -0
- package/vendor/ds/kits/base/test/date-picker.test.ts +122 -0
- package/vendor/ds/kits/base/test/date-range-field.test.ts +96 -0
- package/vendor/ds/kits/base/test/date-range-picker.test.ts +104 -0
- package/vendor/ds/kits/base/test/description-list.test.ts +84 -0
- package/vendor/ds/kits/base/test/dialog-tooltip-failures.test.ts +52 -0
- package/vendor/ds/kits/base/test/dialog.test.ts +122 -0
- package/vendor/ds/kits/base/test/disclosure.test.ts +51 -0
- package/vendor/ds/kits/base/test/drawer-alert-dialog-appearance.test.ts +25 -0
- package/vendor/ds/kits/base/test/drawer-alert-dialog-failures.test.ts +36 -0
- package/vendor/ds/kits/base/test/drawer.test.ts +49 -0
- package/vendor/ds/kits/base/test/dropdown-menu.test.ts +344 -0
- package/vendor/ds/kits/base/test/dropdown-navigation-menu-failures.test.ts +29 -0
- package/vendor/ds/kits/base/test/elevation.test.ts +81 -0
- package/vendor/ds/kits/base/test/empty-state.test.ts +126 -0
- package/vendor/ds/kits/base/test/event-dialect.test.ts +239 -0
- package/vendor/ds/kits/base/test/field.test.ts +106 -0
- package/vendor/ds/kits/base/test/fieldset.test.ts +95 -0
- package/vendor/ds/kits/base/test/file-input.test.ts +99 -0
- package/vendor/ds/kits/base/test/fixtures/AccessibleNameConsumer.svelte +65 -0
- package/vendor/ds/kits/base/test/fixtures/BinaryChoiceConsumer.svelte +63 -0
- package/vendor/ds/kits/base/test/fixtures/BinaryChoiceContractFailures.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/BindingConsumer.svelte +19 -0
- package/vendor/ds/kits/base/test/fixtures/CalendarConsumer.svelte +9 -0
- package/vendor/ds/kits/base/test/fixtures/CalendarContractFailures.svelte +27 -0
- package/vendor/ds/kits/base/test/fixtures/CardActionsConsumer.svelte +12 -0
- package/vendor/ds/kits/base/test/fixtures/CardHorizontalConsumer.svelte +15 -0
- package/vendor/ds/kits/base/test/fixtures/CollectionStructureConsumer.svelte +37 -0
- package/vendor/ds/kits/base/test/fixtures/CollectionStructureContractFailures.svelte +16 -0
- package/vendor/ds/kits/base/test/fixtures/ComboboxConsumer.svelte +43 -0
- package/vendor/ds/kits/base/test/fixtures/ComboboxContractFailures.svelte +27 -0
- package/vendor/ds/kits/base/test/fixtures/ContainerStackSkipLinkFailures.svelte +16 -0
- package/vendor/ds/kits/base/test/fixtures/ContentMaskConsumer.svelte +25 -0
- package/vendor/ds/kits/base/test/fixtures/ContentMaskContractFailures.svelte +19 -0
- package/vendor/ds/kits/base/test/fixtures/ControlledDialogConsumer.svelte +29 -0
- package/vendor/ds/kits/base/test/fixtures/DateEntryConsumer.svelte +45 -0
- package/vendor/ds/kits/base/test/fixtures/DateEntryContractFailures.svelte +31 -0
- package/vendor/ds/kits/base/test/fixtures/DatePickerConsumer.svelte +34 -0
- package/vendor/ds/kits/base/test/fixtures/DatePickerContractFailures.svelte +29 -0
- package/vendor/ds/kits/base/test/fixtures/DialogTooltipBehaviorFailures.svelte +33 -0
- package/vendor/ds/kits/base/test/fixtures/DisclosureFamilyConsumer.svelte +68 -0
- package/vendor/ds/kits/base/test/fixtures/DisclosureFamilyContractFailures.svelte +21 -0
- package/vendor/ds/kits/base/test/fixtures/DrawerAlertDialogBehaviorFailures.svelte +30 -0
- package/vendor/ds/kits/base/test/fixtures/DrawerAlertDialogConsumer.svelte +18 -0
- package/vendor/ds/kits/base/test/fixtures/FieldInputAccessibilityFailures.svelte +29 -0
- package/vendor/ds/kits/base/test/fixtures/FieldInputConsumer.svelte +33 -0
- package/vendor/ds/kits/base/test/fixtures/FormScaffoldingConsumer.svelte +55 -0
- package/vendor/ds/kits/base/test/fixtures/FormScaffoldingFailures.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkBase.svelte +52 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkChoices.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkCodeActions.svelte +15 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkComposition.svelte +36 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkEditReveal.svelte +11 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkField.svelte +10 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkIdentityControls.svelte +11 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkInput.svelte +8 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkManaged.svelte +43 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkMedia.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkNativeControls.svelte +11 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkNumericEntry.svelte +12 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkPrimitive.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkReadings.svelte +23 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkSlides.svelte +31 -0
- package/vendor/ds/kits/base/test/fixtures/FrameworkTextarea.svelte +8 -0
- package/vendor/ds/kits/base/test/fixtures/InlineTextConsumer.svelte +15 -0
- package/vendor/ds/kits/base/test/fixtures/InlineTextContractFailures.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/LayoutConsumer.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/MediaPresentationConsumer.svelte +41 -0
- package/vendor/ds/kits/base/test/fixtures/MediaPresentationContractFailures.svelte +23 -0
- package/vendor/ds/kits/base/test/fixtures/MenuBehaviorFailures.svelte +19 -0
- package/vendor/ds/kits/base/test/fixtures/MockupConsumer.svelte +34 -0
- package/vendor/ds/kits/base/test/fixtures/MockupContractFailures.svelte +23 -0
- package/vendor/ds/kits/base/test/fixtures/NavbarMasthead.svelte +55 -0
- package/vendor/ds/kits/base/test/fixtures/NavigationScopeConsumer.svelte +40 -0
- package/vendor/ds/kits/base/test/fixtures/NotificationEmptyStateConsumer.svelte +28 -0
- package/vendor/ds/kits/base/test/fixtures/NotificationEmptyStateContractFailures.svelte +21 -0
- package/vendor/ds/kits/base/test/fixtures/NumberFieldConsumer.svelte +9 -0
- package/vendor/ds/kits/base/test/fixtures/NumericChronologyConsumer.svelte +34 -0
- package/vendor/ds/kits/base/test/fixtures/NumericChronologyContractFailures.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/Operational.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/PopoverLinkPreviewFailures.svelte +38 -0
- package/vendor/ds/kits/base/test/fixtures/ProgressFeedbackConsumer.svelte +26 -0
- package/vendor/ds/kits/base/test/fixtures/ProgressLoadingContractFailures.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/RangePressedConsumer.svelte +67 -0
- package/vendor/ds/kits/base/test/fixtures/RangePressedContractFailures.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/RevealAppearanceConsumer.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/SpecializedEntryConsumer.svelte +56 -0
- package/vendor/ds/kits/base/test/fixtures/SpecializedEntryContractFailures.svelte +26 -0
- package/vendor/ds/kits/base/test/fixtures/StatusVocabularyConsumer.svelte +19 -0
- package/vendor/ds/kits/base/test/fixtures/StatusVocabularyContractFailures.svelte +5 -0
- package/vendor/ds/kits/base/test/fixtures/SurfaceControlsConsumer.svelte +35 -0
- package/vendor/ds/kits/base/test/fixtures/SurfaceControlsContractFailures.svelte +30 -0
- package/vendor/ds/kits/base/test/fixtures/SurfaceSeparationConsumer.svelte +20 -0
- package/vendor/ds/kits/base/test/fixtures/SurfaceSeparationContractFailures.svelte +15 -0
- package/vendor/ds/kits/base/test/fixtures/TableConsumer.svelte +25 -0
- package/vendor/ds/kits/base/test/fixtures/TableContractFailures.svelte +22 -0
- package/vendor/ds/kits/base/test/fixtures/TabsFragmentConsumer.svelte +18 -0
- package/vendor/ds/kits/base/test/fixtures/TestGlyph.svelte +22 -0
- package/vendor/ds/kits/base/test/fixtures/TextareaSelectConsumer.svelte +30 -0
- package/vendor/ds/kits/base/test/fixtures/TextareaSelectContractFailures.svelte +19 -0
- package/vendor/ds/kits/base/test/fixtures/TimeEntryConsumer.svelte +45 -0
- package/vendor/ds/kits/base/test/fixtures/TimeEntryContractFailures.svelte +29 -0
- package/vendor/ds/kits/base/test/fixtures/TooltipChildConsumer.svelte +10 -0
- package/vendor/ds/kits/base/test/fixtures/UncontrolledFieldConsumer.svelte +16 -0
- package/vendor/ds/kits/base/test/fixtures/WayfindingConsumer.svelte +26 -0
- package/vendor/ds/kits/base/test/fixtures/WayfindingContractFailures.svelte +17 -0
- package/vendor/ds/kits/base/test/fixtures/alert-consumer.ts +11 -0
- package/vendor/ds/kits/base/test/fixtures/binary-choice-consumer.ts +15 -0
- package/vendor/ds/kits/base/test/fixtures/button-consumer.ts +16 -0
- package/vendor/ds/kits/base/test/fixtures/calendar-consumer.ts +7 -0
- package/vendor/ds/kits/base/test/fixtures/collection-structure-consumer.ts +17 -0
- package/vendor/ds/kits/base/test/fixtures/combobox-consumer.ts +9 -0
- package/vendor/ds/kits/base/test/fixtures/content-mask-consumer.ts +10 -0
- package/vendor/ds/kits/base/test/fixtures/date-entry-consumer.ts +11 -0
- package/vendor/ds/kits/base/test/fixtures/date-picker-consumer.ts +11 -0
- package/vendor/ds/kits/base/test/fixtures/dialog-tooltip-consumer.ts +9 -0
- package/vendor/ds/kits/base/test/fixtures/disclosure-family-consumer.ts +14 -0
- package/vendor/ds/kits/base/test/fixtures/drawer-alert-dialog-consumer.ts +13 -0
- package/vendor/ds/kits/base/test/fixtures/field-input-consumer.ts +15 -0
- package/vendor/ds/kits/base/test/fixtures/form-scaffolding-consumer.ts +13 -0
- package/vendor/ds/kits/base/test/fixtures/layout-consumer.ts +16 -0
- package/vendor/ds/kits/base/test/fixtures/media-presentation-consumer.ts +9 -0
- package/vendor/ds/kits/base/test/fixtures/menu-consumer.ts +20 -0
- package/vendor/ds/kits/base/test/fixtures/mockup-consumer.ts +14 -0
- package/vendor/ds/kits/base/test/fixtures/notification-empty-state-consumer.ts +12 -0
- package/vendor/ds/kits/base/test/fixtures/numeric-chronology-consumer.ts +11 -0
- package/vendor/ds/kits/base/test/fixtures/popover-link-preview-consumer.ts +9 -0
- package/vendor/ds/kits/base/test/fixtures/progress-feedback-consumer.ts +21 -0
- package/vendor/ds/kits/base/test/fixtures/range-pressed-consumer.ts +16 -0
- package/vendor/ds/kits/base/test/fixtures/specialized-entry-consumer.ts +15 -0
- package/vendor/ds/kits/base/test/fixtures/status-vocabulary-consumer.ts +22 -0
- package/vendor/ds/kits/base/test/fixtures/surface-controls-consumer.ts +22 -0
- package/vendor/ds/kits/base/test/fixtures/surface-separation-consumer.ts +31 -0
- package/vendor/ds/kits/base/test/fixtures/textarea-select-consumer.ts +13 -0
- package/vendor/ds/kits/base/test/fixtures/time-entry-consumer.ts +11 -0
- package/vendor/ds/kits/base/test/form.test.ts +72 -0
- package/vendor/ds/kits/base/test/framework-appearance.test.ts +53 -0
- package/vendor/ds/kits/base/test/framework-base.test.ts +128 -0
- package/vendor/ds/kits/base/test/framework-choices.test.ts +137 -0
- package/vendor/ds/kits/base/test/framework-code-actions.test.ts +123 -0
- package/vendor/ds/kits/base/test/framework-composition.test.ts +91 -0
- package/vendor/ds/kits/base/test/framework-contracts.test.ts +126 -0
- package/vendor/ds/kits/base/test/framework-edit-reveal.test.ts +183 -0
- package/vendor/ds/kits/base/test/framework-identity-controls.test.ts +162 -0
- package/vendor/ds/kits/base/test/framework-managed.test.ts +256 -0
- package/vendor/ds/kits/base/test/framework-media.test.ts +96 -0
- package/vendor/ds/kits/base/test/framework-native-controls.test.ts +156 -0
- package/vendor/ds/kits/base/test/framework-numeric-entry.test.ts +146 -0
- package/vendor/ds/kits/base/test/framework-operational.test.ts +162 -0
- package/vendor/ds/kits/base/test/framework-readings.test.ts +110 -0
- package/vendor/ds/kits/base/test/framework-slides.test.ts +100 -0
- package/vendor/ds/kits/base/test/grid-list.test.ts +64 -0
- package/vendor/ds/kits/base/test/icon.test.ts +59 -0
- package/vendor/ds/kits/base/test/image.test.ts +120 -0
- package/vendor/ds/kits/base/test/indicator.test.ts +68 -0
- package/vendor/ds/kits/base/test/inline-edit.test.ts +56 -0
- package/vendor/ds/kits/base/test/input.test.ts +82 -0
- package/vendor/ds/kits/base/test/kbd.test.ts +32 -0
- package/vendor/ds/kits/base/test/label-in-name.ts +43 -0
- package/vendor/ds/kits/base/test/label.test.ts +68 -0
- package/vendor/ds/kits/base/test/link-kbd-code-block-appearance.test.ts +31 -0
- package/vendor/ds/kits/base/test/link-preview.test.ts +80 -0
- package/vendor/ds/kits/base/test/link.test.ts +63 -0
- package/vendor/ds/kits/base/test/lint.test.ts +60 -0
- package/vendor/ds/kits/base/test/list-container.test.ts +45 -0
- package/vendor/ds/kits/base/test/list.test.ts +60 -0
- package/vendor/ds/kits/base/test/loading-indicator.test.ts +57 -0
- package/vendor/ds/kits/base/test/logo.test.ts +484 -0
- package/vendor/ds/kits/base/test/marks.test.ts +140 -0
- package/vendor/ds/kits/base/test/media-object.test.ts +58 -0
- package/vendor/ds/kits/base/test/meter.test.ts +79 -0
- package/vendor/ds/kits/base/test/mount.ts +79 -0
- package/vendor/ds/kits/base/test/navbar.test.ts +419 -0
- package/vendor/ds/kits/base/test/navigation-menu.test.ts +118 -0
- package/vendor/ds/kits/base/test/navigation-scope.test.ts +62 -0
- package/vendor/ds/kits/base/test/notification.test.ts +94 -0
- package/vendor/ds/kits/base/test/number-field.test.ts +38 -0
- package/vendor/ds/kits/base/test/one-time-code-input.test.ts +123 -0
- package/vendor/ds/kits/base/test/pagination.test.ts +50 -0
- package/vendor/ds/kits/base/test/phone-input.test.ts +95 -0
- package/vendor/ds/kits/base/test/phone-mockup.test.ts +51 -0
- package/vendor/ds/kits/base/test/popover-link-preview-failures.test.ts +43 -0
- package/vendor/ds/kits/base/test/popover.test.ts +79 -0
- package/vendor/ds/kits/base/test/progress-loading-failures.test.ts +27 -0
- package/vendor/ds/kits/base/test/progress.test.ts +70 -0
- package/vendor/ds/kits/base/test/prose.test.ts +138 -0
- package/vendor/ds/kits/base/test/quiet-control.test.ts +89 -0
- package/vendor/ds/kits/base/test/radial-progress.test.ts +52 -0
- package/vendor/ds/kits/base/test/radio-cards.test.ts +21 -0
- package/vendor/ds/kits/base/test/radio-group.test.ts +180 -0
- package/vendor/ds/kits/base/test/range-calendar.test.ts +102 -0
- package/vendor/ds/kits/base/test/rating.test.ts +98 -0
- package/vendor/ds/kits/base/test/react-accessible-name.test.ts +44 -0
- package/vendor/ds/kits/base/test/react-consumer.tsx +283 -0
- package/vendor/ds/kits/base/test/react.test.ts +110 -0
- package/vendor/ds/kits/base/test/reveal.test.ts +148 -0
- package/vendor/ds/kits/base/test/scroll-area.test.ts +58 -0
- package/vendor/ds/kits/base/test/search-select.test.ts +40 -0
- package/vendor/ds/kits/base/test/section-heading.test.ts +59 -0
- package/vendor/ds/kits/base/test/select.test.ts +125 -0
- package/vendor/ds/kits/base/test/setup-storage.ts +14 -0
- package/vendor/ds/kits/base/test/skeleton.test.ts +56 -0
- package/vendor/ds/kits/base/test/skip-link.test.ts +49 -0
- package/vendor/ds/kits/base/test/slider.test.ts +89 -0
- package/vendor/ds/kits/base/test/slides.test.ts +207 -0
- package/vendor/ds/kits/base/test/stack.test.ts +87 -0
- package/vendor/ds/kits/base/test/statistic.test.ts +37 -0
- package/vendor/ds/kits/base/test/status-indicator.test.ts +102 -0
- package/vendor/ds/kits/base/test/steps.test.ts +38 -0
- package/vendor/ds/kits/base/test/structured-data.test.ts +88 -0
- package/vendor/ds/kits/base/test/swap.test.ts +70 -0
- package/vendor/ds/kits/base/test/switch.test.ts +89 -0
- package/vendor/ds/kits/base/test/table.test.ts +108 -0
- package/vendor/ds/kits/base/test/tabs.test.ts +130 -0
- package/vendor/ds/kits/base/test/taxonomy.test.ts +41 -0
- package/vendor/ds/kits/base/test/textarea.test.ts +106 -0
- package/vendor/ds/kits/base/test/time-field.test.ts +108 -0
- package/vendor/ds/kits/base/test/time-range-field.test.ts +91 -0
- package/vendor/ds/kits/base/test/timeline.test.ts +75 -0
- package/vendor/ds/kits/base/test/toggle-button.test.ts +70 -0
- package/vendor/ds/kits/base/test/toggle-group.test.ts +177 -0
- package/vendor/ds/kits/base/test/tooltip.test.ts +61 -0
- package/vendor/ds/kits/base/test/type-primitives.test.ts +191 -0
- package/vendor/ds/kits/base/test/vocabulary-contrast.test.ts +258 -0
- package/vendor/ds/kits/base/test/wave2-bindings-overlays.test.ts +174 -0
- package/vendor/ds/kits/base/test/window-mockup.test.ts +49 -0
- package/vendor/ds/kits/base/tools/build-cli.ts +29 -0
- package/vendor/ds/kits/base/tools/lint-cli.ts +18 -0
- package/vendor/ds/kits/base/tools/paths.ts +46 -0
- package/vendor/ds/kits/base/tsconfig.consumer.json +19 -0
- package/vendor/ds/kits/base/tsconfig.json +26 -0
- package/vendor/ds/kits/base/type-ledger.json +4 -0
- package/vendor/ds/kits/base/types/marks.d.ts +20 -0
- package/vendor/ds/kits/base/vite.config.ts +29 -0
- package/vendor/ds/package.json +51 -0
- package/vendor/ds/styles/all.css +12 -0
- package/vendor/ds/styles/application.css +12 -0
- package/vendor/ds/styles/base.css +11 -0
- package/vendor/ds/theme/print.css +65 -0
- package/vendor/ds/theme/scheme-dark.css +77 -0
- package/vendor/ds/theme/scheme-light.css +78 -0
- package/vendor/ds/theme/theme-application.css +29 -0
- package/vendor/ds/theme/theme-base.css +180 -0
- package/vendor/ds/theme/theme.css +283 -0
- package/vendor/ds/tokens/density-comfortable.css +51 -0
- package/vendor/ds/tokens/density-compact.css +49 -0
- package/vendor/ds/tokens/density-spacious.css +49 -0
- package/vendor/ds/tokens/density-tiny.css +49 -0
- package/vendor/ds/tokens/tokens.css +182 -0
- package/src/lib/Kbd.svelte +0 -8
- package/src/lib/LoadingState.svelte +0 -20
- package/src/lib/NavItem.svelte +0 -53
- package/src/lib/SplitView.svelte +0 -145
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Density-owned icon sizes shared by native adapters. */
|
|
2
|
+
export const ICON_SIZES = ["sm", "md", "lg"] as const;
|
|
3
|
+
export type IconSize = (typeof ICON_SIZES)[number];
|
|
4
|
+
/** Semantic ink roles accepted by Icon. */
|
|
5
|
+
export const ICON_COLORS = ["current", "foreground", "ink-muted", "primary", "on-primary", "feedback-danger-foreground", "feedback-success-foreground", "feedback-warning-foreground", "feedback-info-foreground"] as const;
|
|
6
|
+
export type IconColor = (typeof ICON_COLORS)[number];
|
|
7
|
+
/** @deprecated Use ink-muted; muted is a surface role. */
|
|
8
|
+
export type DeprecatedIconColor = "muted";
|
|
9
|
+
/** Resolve a semantic role, including the retained deprecated alias. */
|
|
10
|
+
export function iconColor(color: IconColor | DeprecatedIconColor): string {
|
|
11
|
+
const role = color === "muted" ? "ink-muted" : color;
|
|
12
|
+
return role === "current" ? "currentColor" : `var(--reddb-color-${role})`;
|
|
13
|
+
}
|
|
14
|
+
/** Density controls glyph dimensions independently of the control hit area. */
|
|
15
|
+
export function iconDimension(size: IconSize): string { return `var(--reddb-spatial-icon-size-${size})`; }
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/** Portable field semantics shared by the native InlineEdit adapters. */
|
|
2
|
+
export interface InlineEditContract {
|
|
3
|
+
/** Visible field name, also used to name its edit and input controls. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Read layout: compact text by default, or a full-width saved value that becomes an input only while editing. */
|
|
6
|
+
presentation?: "text" | "input";
|
|
7
|
+
/** Whether the edit action is always visible or revealed by hover/focus. Touch always shows it. */
|
|
8
|
+
editVisibility?: "always" | "hover";
|
|
9
|
+
/** Caller-supplied provenance, such as API, imported file or organization defaults. Never inferred. */
|
|
10
|
+
sourceLabel?: string;
|
|
11
|
+
/** Visible committed-state label in input presentation. Defaults to Saved. */
|
|
12
|
+
savedLabel?: string;
|
|
13
|
+
/** Native string input type while editing. Password values are masked in the read view. Defaults to text. */
|
|
14
|
+
inputType?: "text" | "password" | "email" | "url" | "tel";
|
|
15
|
+
/** Committed text. Draft keystrokes never change this value. */
|
|
16
|
+
value: string;
|
|
17
|
+
/** Whether the draft editor is open; caller-owned in controlled React use. */
|
|
18
|
+
editing?: boolean;
|
|
19
|
+
/** Initial uncontrolled editor state; later changes do not replace the user's choice. */
|
|
20
|
+
defaultEditing?: boolean;
|
|
21
|
+
/** Optional application validation; return an error to retain the draft. */
|
|
22
|
+
validate?: (value: string) => string | undefined;
|
|
23
|
+
/** Prevents opening or submitting the editor. */
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/** Requires at least one non-whitespace character. Defaults to true. */
|
|
26
|
+
required?: boolean;
|
|
27
|
+
/** Optional maximum number of characters accepted by the native input. */
|
|
28
|
+
maxlength?: number;
|
|
29
|
+
/** Visible text when the committed value is empty. */
|
|
30
|
+
emptyLabel?: string;
|
|
31
|
+
/** Label of the action that opens the editor. */
|
|
32
|
+
editLabel?: string;
|
|
33
|
+
/** Label of the action that persists the draft. */
|
|
34
|
+
saveLabel?: string;
|
|
35
|
+
/** Label of the action that discards the draft. */
|
|
36
|
+
cancelLabel?: string;
|
|
37
|
+
/** Validation message for a required empty draft. */
|
|
38
|
+
requiredMessage?: string;
|
|
39
|
+
/** Message announced when persistence rejects. */
|
|
40
|
+
saveErrorMessage?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface InlineEditState { draft: string; error: string; saving: boolean }
|
|
44
|
+
export interface InlineEditSaveOptions {
|
|
45
|
+
required: boolean;
|
|
46
|
+
requiredMessage: string;
|
|
47
|
+
saveErrorMessage: string;
|
|
48
|
+
validate?: (value: string) => string | undefined;
|
|
49
|
+
confirm?: (value: string) => void | Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export type InlineEditResult = { status: "committed"; value: string } | { status: "invalid" | "failed" | "busy" | "stale" };
|
|
52
|
+
|
|
53
|
+
/** A draft transaction; invalidated confirmations cannot commit a later editing session. */
|
|
54
|
+
export function createInlineEditSession(value: string, changed: (state: InlineEditState) => void) {
|
|
55
|
+
let state: InlineEditState = { draft: value, error: "", saving: false };
|
|
56
|
+
let generation = 0;
|
|
57
|
+
const publish = (next: InlineEditState) => { state = next; changed(state); };
|
|
58
|
+
return {
|
|
59
|
+
get state() { return state; },
|
|
60
|
+
invalidate() { generation++; },
|
|
61
|
+
reset(value: string) { generation++; publish({ draft: value, error: "", saving: false }); },
|
|
62
|
+
change(draft: string) { if (!state.saving) publish({ ...state, draft, error: "" }); },
|
|
63
|
+
async save(options: InlineEditSaveOptions): Promise<InlineEditResult> {
|
|
64
|
+
if (state.saving) return { status: "busy" };
|
|
65
|
+
const candidate = state.draft;
|
|
66
|
+
const error = options.required && !candidate.trim() ? options.requiredMessage : options.validate?.(candidate) ?? "";
|
|
67
|
+
if (error) { publish({ ...state, error }); return { status: "invalid" }; }
|
|
68
|
+
const ticket = ++generation;
|
|
69
|
+
publish({ ...state, saving: true, error: "" });
|
|
70
|
+
try { await options.confirm?.(candidate); }
|
|
71
|
+
catch {
|
|
72
|
+
if (ticket !== generation) return { status: "stale" };
|
|
73
|
+
publish({ ...state, error: options.saveErrorMessage, saving: false });
|
|
74
|
+
return { status: "failed" };
|
|
75
|
+
}
|
|
76
|
+
if (ticket !== generation) return { status: "stale" };
|
|
77
|
+
publish({ ...state, saving: false });
|
|
78
|
+
return { status: "committed", value: candidate };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Read mode is selectable text; password values never enter the read DOM. */
|
|
84
|
+
export function inlineEditReadValue(value: string, inputType: InlineEditContract["inputType"], emptyLabel: string): string {
|
|
85
|
+
return value ? (inputType === "password" ? "••••••••" : value) : emptyLabel;
|
|
86
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The numeric native input types report numbers; an empty number reports null. */
|
|
2
|
+
export type InputValue<Type extends string> = string extends Type ? string | number | null : Type extends "number" | "range" ? number | null : string;
|
|
3
|
+
|
|
4
|
+
/** Read a platform input without depending on a rendering framework or globals. */
|
|
5
|
+
export function inputValue<Type extends string>(input: { type: Type; value: string; valueAsNumber: number }): InputValue<Type> {
|
|
6
|
+
return (input.type === "number" || input.type === "range"
|
|
7
|
+
? input.value === "" ? null : input.valueAsNumber
|
|
8
|
+
: input.value) as InputValue<Type>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Native dialog lifecycle shared by every renderer, including nested scroll locks. */
|
|
2
|
+
const locks = new WeakMap<Document, { count: number; overflow: string }>();
|
|
3
|
+
|
|
4
|
+
/** A host shell must yield its shortcuts to events originating in a modal, including shadow DOM. */
|
|
5
|
+
export function isEventFromModal(event: Event): boolean {
|
|
6
|
+
const path = event.composedPath();
|
|
7
|
+
const targets = path.length ? path : [event.target];
|
|
8
|
+
return targets.some(target => {
|
|
9
|
+
const element = target as Element | null;
|
|
10
|
+
return element?.nodeType === 1 && typeof element.closest === "function" &&
|
|
11
|
+
element.closest('dialog[open], [role="dialog"][aria-modal="true"], [role="alertdialog"][aria-modal="true"]') !== null;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export const modalFocusable = 'button:not([disabled]),a[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
|
|
15
|
+
export interface ModalOptions {
|
|
16
|
+
initialFocus(): "body" | "actions";
|
|
17
|
+
dismissible(): boolean;
|
|
18
|
+
requestOpen(open: boolean): void;
|
|
19
|
+
}
|
|
20
|
+
export function createModalController(dialog: HTMLDialogElement, options: ModalOptions) {
|
|
21
|
+
const document = dialog.ownerDocument;
|
|
22
|
+
let active = false, returnFocus: HTMLElement | null = null;
|
|
23
|
+
const focusables = () => [...dialog.querySelectorAll<HTMLElement>(modalFocusable)].filter(element => !element.closest('[hidden],[inert]') && !element.matches(":disabled") && element.tabIndex >= 0 && element.closest("dialog") === dialog);
|
|
24
|
+
function release(close = false) {
|
|
25
|
+
if (!active) return;
|
|
26
|
+
active = false;
|
|
27
|
+
const lock = locks.get(document);
|
|
28
|
+
if (lock && --lock.count === 0) { document.documentElement.style.overflow = lock.overflow; locks.delete(document); }
|
|
29
|
+
if (close && dialog.open) { if (typeof dialog.close === "function") dialog.close(); else dialog.removeAttribute("open"); }
|
|
30
|
+
if (returnFocus?.isConnected) returnFocus.focus();
|
|
31
|
+
returnFocus = null;
|
|
32
|
+
}
|
|
33
|
+
function sync(open: boolean) {
|
|
34
|
+
if (open && !active) {
|
|
35
|
+
returnFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
36
|
+
if (!dialog.open) {
|
|
37
|
+
if (typeof dialog.showModal === "function") dialog.showModal(); else dialog.setAttribute("open", "");
|
|
38
|
+
}
|
|
39
|
+
active = true;
|
|
40
|
+
const lock = locks.get(document) ?? { count: 0, overflow: document.documentElement.style.overflow };
|
|
41
|
+
lock.count++; locks.set(document, lock); document.documentElement.style.overflow = "hidden";
|
|
42
|
+
const region = dialog.querySelector<HTMLElement>(options.initialFocus() === "actions" ? "[data-dialog-actions]" : "[data-dialog-body]");
|
|
43
|
+
(focusables().find(element => region?.contains(element)) ?? focusables()[0] ?? dialog).focus();
|
|
44
|
+
} else if (!open && active) {
|
|
45
|
+
release(true);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function keydown(event: KeyboardEvent) {
|
|
49
|
+
if (event.target instanceof Element && event.target.closest("dialog") !== dialog) return;
|
|
50
|
+
if (event.key !== "Tab") return;
|
|
51
|
+
if (event.target instanceof Element && event.target.closest("[data-ds-focus-scope]")) return;
|
|
52
|
+
const nodes = focusables(), first = nodes[0], last = nodes.at(-1);
|
|
53
|
+
if (!first || !last) { event.preventDefault(); dialog.focus(); }
|
|
54
|
+
else if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }
|
|
55
|
+
else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }
|
|
56
|
+
}
|
|
57
|
+
// Managed popups arbitrate Escape on Document. Listen after them at Window
|
|
58
|
+
// so one key dismisses only the innermost active layer, including portals.
|
|
59
|
+
function escape(event: KeyboardEvent) {
|
|
60
|
+
if (!active || event.defaultPrevented || event.key !== "Escape" || !(event.target instanceof Element) || event.target.closest("dialog") !== dialog) return;
|
|
61
|
+
event.preventDefault(); event.stopPropagation(); options.requestOpen(false);
|
|
62
|
+
}
|
|
63
|
+
function click(event: MouseEvent) {
|
|
64
|
+
if (!options.dismissible() || event.target !== dialog) return;
|
|
65
|
+
const box = dialog.getBoundingClientRect();
|
|
66
|
+
if (event.clientX < box.left || event.clientX > box.right || event.clientY < box.top || event.clientY > box.bottom) options.requestOpen(false);
|
|
67
|
+
}
|
|
68
|
+
function cancel(event: Event) { event.preventDefault(); options.requestOpen(false); }
|
|
69
|
+
function closed() { if (active && !dialog.open) { release(); options.requestOpen(false); } }
|
|
70
|
+
document.defaultView?.addEventListener("keydown", escape);
|
|
71
|
+
dialog.addEventListener("keydown", keydown); dialog.addEventListener("click", click); dialog.addEventListener("cancel", cancel); dialog.addEventListener("close", closed);
|
|
72
|
+
return { sync, destroy() { release(true); document.defaultView?.removeEventListener("keydown", escape); dialog.removeEventListener("keydown", keydown); dialog.removeEventListener("click", click); dialog.removeEventListener("cancel", cancel); dialog.removeEventListener("close", closed); } };
|
|
73
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** A locked selection reports no change when it is already pressed. */
|
|
2
|
+
export function nextPressed(pressed: boolean, allowUnpress: boolean): boolean {
|
|
3
|
+
return pressed && !allowUnpress ? pressed : !pressed;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/** Keep a native radio group usable for fractional and non-finite stop counts. */
|
|
7
|
+
export function ratingStops(max: number): number[] {
|
|
8
|
+
const count = Number.isFinite(max) ? Math.max(1, Math.floor(max)) : 5;
|
|
9
|
+
return Array.from({ length: count }, (_, index) => index + 1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** File feedback never exposes a local filesystem path. */
|
|
13
|
+
export function fileNames(files: FileList | null | undefined): string[] {
|
|
14
|
+
return Array.from(files ?? [], file => file.name);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A browser may flush microtasks between reset listeners and the default action.
|
|
19
|
+
* Reconcile in the next task, after native controls and outputs have reset.
|
|
20
|
+
*/
|
|
21
|
+
export function afterFormReset(form: HTMLFormElement | null | undefined, reconcile: () => void): () => void {
|
|
22
|
+
const pending = new Set<ReturnType<typeof setTimeout>>();
|
|
23
|
+
const reset = (event: Event) => {
|
|
24
|
+
const timer = setTimeout(() => {
|
|
25
|
+
pending.delete(timer);
|
|
26
|
+
if (!event.defaultPrevented) reconcile();
|
|
27
|
+
}, 0);
|
|
28
|
+
pending.add(timer);
|
|
29
|
+
};
|
|
30
|
+
form?.addEventListener("reset", reset);
|
|
31
|
+
return () => {
|
|
32
|
+
form?.removeEventListener("reset", reset);
|
|
33
|
+
pending.forEach(timer => clearTimeout(timer));
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Resolve explicit form ownership before a child snippet has patched its native attribute. */
|
|
38
|
+
export function associatedForm(control: HTMLInputElement | HTMLFieldSetElement | null | undefined, formId?: string | null): HTMLFormElement | null {
|
|
39
|
+
if (!control) return null;
|
|
40
|
+
if (formId == null) return control.form;
|
|
41
|
+
const owner = control.ownerDocument.getElementById(formId);
|
|
42
|
+
return owner?.tagName === "FORM" ? owner as HTMLFormElement : null;
|
|
43
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type NavbarCollapse = "responsive" | "expanded" | "collapsed";
|
|
2
|
+
export type NavbarAlign = "start" | "center";
|
|
3
|
+
export const NAVBAR_ALIGNMENTS = ["start", "center"] as const satisfies readonly NavbarAlign[];
|
|
4
|
+
export const NAVBAR_COLLAPSE = ["responsive", "expanded", "collapsed"] as const satisfies readonly NavbarCollapse[];
|
|
5
|
+
export interface NavbarArrangements { rail: boolean; compact: boolean }
|
|
6
|
+
/** Decide arrangements without consulting viewport state in JavaScript. */
|
|
7
|
+
export function arrangements(collapse: NavbarCollapse): NavbarArrangements { return { rail: collapse !== "collapsed", compact: collapse !== "expanded" }; }
|
|
8
|
+
export interface NavbarLink {
|
|
9
|
+
id: string;
|
|
10
|
+
label: string;
|
|
11
|
+
href?: string;
|
|
12
|
+
current?: boolean | "page" | "step" | "location" | "date" | "time" | "true";
|
|
13
|
+
active?: boolean;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
onselect?: () => void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** A shell coordinates independent navigation disclosures without choosing any layout. */
|
|
2
|
+
export function createNavigationDisclosures() {
|
|
3
|
+
const closers = new Set<() => void>();
|
|
4
|
+
return {
|
|
5
|
+
register(close: () => void) {
|
|
6
|
+
closers.add(close);
|
|
7
|
+
return { open() { for (const other of closers) if (other !== close) other(); }, destroy() { closers.delete(close); } };
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** What a consumer injects to route the links inside a scope. */
|
|
2
|
+
export interface NavigationSeam {
|
|
3
|
+
/** Activate an in-app destination instead of letting the browser follow it. */
|
|
4
|
+
navigate: (href: string, event: MouseEvent) => void;
|
|
5
|
+
/**
|
|
6
|
+
* Turn a destination into the href a link renders. The Design System never
|
|
7
|
+
* builds a route itself; this is for the caller composing links in the scope.
|
|
8
|
+
*/
|
|
9
|
+
resolve?: (to: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Whether this scope routes `href`. The default takes same-origin paths and
|
|
12
|
+
* leaves fragments, other origins and non-HTTP schemes to the browser.
|
|
13
|
+
*/
|
|
14
|
+
owns?: (href: string, anchor: HTMLAnchorElement) => boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** The default `owns`: a same-origin, non-fragment destination. */
|
|
18
|
+
export function ownsSameOrigin(href: string, anchor: HTMLAnchorElement): boolean {
|
|
19
|
+
if (href === "" || href.startsWith("#")) return false;
|
|
20
|
+
const url = new URL(anchor.href, anchor.ownerDocument.baseURI);
|
|
21
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return false;
|
|
22
|
+
return url.origin === new URL(anchor.ownerDocument.baseURI).origin;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The anchor a click activates, when the scope should route it — or `null`
|
|
27
|
+
* when the browser should keep the activation: a modified or non-primary
|
|
28
|
+
* click (open in a new tab is the user's call), an already-handled event, a
|
|
29
|
+
* link that targets another browsing context, a download, or an explicit
|
|
30
|
+
* `data-native-navigation` opt-out.
|
|
31
|
+
*/
|
|
32
|
+
export function routableAnchor(
|
|
33
|
+
event: MouseEvent,
|
|
34
|
+
scope: Element,
|
|
35
|
+
owns: NonNullable<NavigationSeam["owns"]> = ownsSameOrigin,
|
|
36
|
+
): HTMLAnchorElement | null {
|
|
37
|
+
if (event.defaultPrevented || event.button !== 0) return null;
|
|
38
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return null;
|
|
39
|
+
const target = event.target;
|
|
40
|
+
if (!(target instanceof Element)) return null;
|
|
41
|
+
const anchor = target.closest<HTMLAnchorElement>("a[href]");
|
|
42
|
+
if (!anchor || !scope.contains(anchor)) return null;
|
|
43
|
+
if (anchor.hasAttribute("download") || anchor.hasAttribute("data-native-navigation")) return null;
|
|
44
|
+
const targetContext = anchor.getAttribute("target");
|
|
45
|
+
if (targetContext !== null && targetContext !== "" && targetContext !== "_self") return null;
|
|
46
|
+
const href = anchor.getAttribute("href") ?? "";
|
|
47
|
+
return owns(href, anchor) ? anchor : null;
|
|
48
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Native number constraints shared by both adapters; arithmetic stays in stepUp/stepDown. */
|
|
2
|
+
export function numberConstraints(min: number | undefined, max: number | undefined, step: number) {
|
|
3
|
+
if ((min !== undefined && !Number.isFinite(min)) || (max !== undefined && !Number.isFinite(max)) ||
|
|
4
|
+
!Number.isFinite(step) || step <= 0 || (min !== undefined && max !== undefined && max < min)) {
|
|
5
|
+
throw new Error("NumberField: use finite bounds, max >= min, and a positive finite step.");
|
|
6
|
+
}
|
|
7
|
+
return { min, max, step };
|
|
8
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** An OTP always has a finite positive integer number of native segments. */
|
|
2
|
+
export function codeLength(length: number): number {
|
|
3
|
+
if (!Number.isSafeInteger(length) || length < 1) throw new Error("OneTimeCodeInput: length must be a positive integer.");
|
|
4
|
+
return length;
|
|
5
|
+
}
|
|
6
|
+
/** Canonical ASCII alphanumeric entry; the caller's native pattern owns validation. */
|
|
7
|
+
export function codeCharacters(text: string, limit: number): string[] {
|
|
8
|
+
return text.replace(/[^a-zA-Z0-9]/g, "").slice(0, limit).split("");
|
|
9
|
+
}
|
|
10
|
+
/** Keep empty positions while editing; flatten only for the public complete-code value. */
|
|
11
|
+
export function codeSegments(value: string, length: number): string[] {
|
|
12
|
+
return Array.from({ length: codeLength(length) }, (_, index) => value[index] ?? "");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Native keyboard hint shared by both OTP adapters. */
|
|
16
|
+
export const ONE_TIME_CODE_INPUT_MODES = ["none", "text", "decimal", "numeric", "tel", "search", "email", "url"] as const;
|
|
17
|
+
export type OneTimeCodeInputMode = (typeof ONE_TIME_CODE_INPUT_MODES)[number];
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/** Native visibility/motion observation with adapter-owned cleanup. */
|
|
2
|
+
export function observeActivity(
|
|
3
|
+
element: Element,
|
|
4
|
+
change: (allowed: boolean) => void,
|
|
5
|
+
) {
|
|
6
|
+
const doc = element.ownerDocument,
|
|
7
|
+
win = doc.defaultView;
|
|
8
|
+
if (!win) {
|
|
9
|
+
change(false);
|
|
10
|
+
return () => {};
|
|
11
|
+
}
|
|
12
|
+
const media = win.matchMedia?.("(prefers-reduced-motion: reduce)");
|
|
13
|
+
const bounds = element.getBoundingClientRect();
|
|
14
|
+
let inView =
|
|
15
|
+
typeof win.IntersectionObserver !== "function" ||
|
|
16
|
+
(bounds.width > 0 &&
|
|
17
|
+
bounds.height > 0 &&
|
|
18
|
+
bounds.bottom >= 0 &&
|
|
19
|
+
bounds.right >= 0 &&
|
|
20
|
+
bounds.top <= win.innerHeight &&
|
|
21
|
+
bounds.left <= win.innerWidth);
|
|
22
|
+
const update = () => change(inView && !doc.hidden && !media?.matches);
|
|
23
|
+
const observer =
|
|
24
|
+
typeof win.IntersectionObserver === "function"
|
|
25
|
+
? new win.IntersectionObserver((entries) => {
|
|
26
|
+
inView = entries.some((e) => e.isIntersecting);
|
|
27
|
+
update();
|
|
28
|
+
})
|
|
29
|
+
: undefined;
|
|
30
|
+
observer?.observe(element);
|
|
31
|
+
doc.addEventListener("visibilitychange", update);
|
|
32
|
+
media?.addEventListener("change", update);
|
|
33
|
+
update();
|
|
34
|
+
return () => {
|
|
35
|
+
observer?.disconnect();
|
|
36
|
+
doc.removeEventListener("visibilitychange", update);
|
|
37
|
+
media?.removeEventListener("change", update);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Semantics update immediately; only paint receives an optional fade. */
|
|
41
|
+
export function valuePresentation(element: HTMLElement) {
|
|
42
|
+
let key: unknown,
|
|
43
|
+
initial = true,
|
|
44
|
+
animation: Animation | undefined,
|
|
45
|
+
allowed = false;
|
|
46
|
+
const stop = observeActivity(element, (next) => {
|
|
47
|
+
allowed = next;
|
|
48
|
+
if (!next) animation?.cancel();
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
update(next: unknown, enabled: boolean) {
|
|
52
|
+
const changed = !initial && key !== next;
|
|
53
|
+
initial = false;
|
|
54
|
+
key = next;
|
|
55
|
+
animation?.cancel();
|
|
56
|
+
if (changed && enabled && allowed)
|
|
57
|
+
animation = element.animate?.([{ opacity: 0.45 }, { opacity: 1 }], {
|
|
58
|
+
duration: 180,
|
|
59
|
+
easing: "ease-out",
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
destroy() {
|
|
63
|
+
animation?.cancel();
|
|
64
|
+
stop();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** A decorative clone never owns committed state or focus. */
|
|
69
|
+
export function transferPresentation(
|
|
70
|
+
host: HTMLElement,
|
|
71
|
+
fromId: string,
|
|
72
|
+
toId: string,
|
|
73
|
+
duration: number,
|
|
74
|
+
) {
|
|
75
|
+
const doc = host.ownerDocument,
|
|
76
|
+
from = doc.getElementById(fromId),
|
|
77
|
+
to = doc.getElementById(toId),
|
|
78
|
+
win = doc.defaultView;
|
|
79
|
+
if (
|
|
80
|
+
!from ||
|
|
81
|
+
!to ||
|
|
82
|
+
from === to ||
|
|
83
|
+
doc.hidden ||
|
|
84
|
+
win?.matchMedia?.("(prefers-reduced-motion: reduce)").matches
|
|
85
|
+
)
|
|
86
|
+
return () => {};
|
|
87
|
+
const a = from.getBoundingClientRect(),
|
|
88
|
+
b = to.getBoundingClientRect();
|
|
89
|
+
if (
|
|
90
|
+
!a.width ||
|
|
91
|
+
!a.height ||
|
|
92
|
+
!b.width ||
|
|
93
|
+
!b.height ||
|
|
94
|
+
!win ||
|
|
95
|
+
a.bottom < 0 ||
|
|
96
|
+
a.top > win.innerHeight ||
|
|
97
|
+
a.right < 0 ||
|
|
98
|
+
a.left > win.innerWidth
|
|
99
|
+
)
|
|
100
|
+
return () => {};
|
|
101
|
+
const clone = from.cloneNode(true) as HTMLElement;
|
|
102
|
+
for (const node of [clone, ...clone.querySelectorAll<HTMLElement>("*")]) {
|
|
103
|
+
node.removeAttribute("id");
|
|
104
|
+
node.removeAttribute("name");
|
|
105
|
+
node.removeAttribute("autofocus");
|
|
106
|
+
}
|
|
107
|
+
clone.inert = true;
|
|
108
|
+
clone.setAttribute("aria-hidden", "true");
|
|
109
|
+
clone.setAttribute("data-transfer-clone", "");
|
|
110
|
+
Object.assign(clone.style, {
|
|
111
|
+
position: "fixed",
|
|
112
|
+
left: `${a.left}px`,
|
|
113
|
+
top: `${a.top}px`,
|
|
114
|
+
width: `${a.width}px`,
|
|
115
|
+
height: `${a.height}px`,
|
|
116
|
+
margin: "0",
|
|
117
|
+
pointerEvents: "none",
|
|
118
|
+
transformOrigin: "top left",
|
|
119
|
+
zIndex: "2147483647",
|
|
120
|
+
});
|
|
121
|
+
const material = win.getComputedStyle(from);
|
|
122
|
+
for (let i = 0; i < material.length; i++) {
|
|
123
|
+
const property = material.item(i);
|
|
124
|
+
if (property.startsWith("--reddb-"))
|
|
125
|
+
clone.style.setProperty(property, material.getPropertyValue(property));
|
|
126
|
+
}
|
|
127
|
+
Object.assign(clone.style, {
|
|
128
|
+
fontFamily: material.fontFamily,
|
|
129
|
+
fontSize: material.fontSize,
|
|
130
|
+
lineHeight: material.lineHeight,
|
|
131
|
+
color: material.color,
|
|
132
|
+
});
|
|
133
|
+
doc.body.append(clone);
|
|
134
|
+
let animation: Animation | undefined,
|
|
135
|
+
disposed = false;
|
|
136
|
+
let stop = () => {};
|
|
137
|
+
const destroy = () => {
|
|
138
|
+
if (disposed) return;
|
|
139
|
+
disposed = true;
|
|
140
|
+
stop();
|
|
141
|
+
animation?.cancel();
|
|
142
|
+
clone.remove();
|
|
143
|
+
};
|
|
144
|
+
stop = observeActivity(from, (allowed) => {
|
|
145
|
+
if (!allowed) destroy();
|
|
146
|
+
});
|
|
147
|
+
if (disposed) {
|
|
148
|
+
stop();
|
|
149
|
+
return destroy;
|
|
150
|
+
}
|
|
151
|
+
animation = clone.animate?.(
|
|
152
|
+
[
|
|
153
|
+
{ transform: "translate(0, 0) scale(1)", opacity: 0.9 },
|
|
154
|
+
{
|
|
155
|
+
transform: `translate(${b.left - a.left}px, ${b.top - a.top}px) scale(${b.width / a.width}, ${b.height / a.height})`,
|
|
156
|
+
opacity: 0,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
{
|
|
160
|
+
duration: Math.max(
|
|
161
|
+
0,
|
|
162
|
+
Math.min(1500, Number.isFinite(duration) ? duration : 400),
|
|
163
|
+
),
|
|
164
|
+
easing: "cubic-bezier(.16,1,.3,1)",
|
|
165
|
+
fill: "forwards",
|
|
166
|
+
},
|
|
167
|
+
);
|
|
168
|
+
if (animation) animation.finished.then(destroy, destroy);
|
|
169
|
+
else destroy();
|
|
170
|
+
return () => {
|
|
171
|
+
stop();
|
|
172
|
+
destroy();
|
|
173
|
+
};
|
|
174
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AsYouType, getCountries, getCountryCallingCode, parseIncompletePhoneNumber } from "libphonenumber-js/min";
|
|
2
|
+
import type { PhoneCountry } from "./contracts/phoneinput";
|
|
3
|
+
import type { SearchSelectOption } from "../search-select.variants";
|
|
4
|
+
export type { PhoneCountry } from "./contracts/phoneinput";
|
|
5
|
+
export interface PhoneState {
|
|
6
|
+
country: PhoneCountry;
|
|
7
|
+
display: string;
|
|
8
|
+
value: string;
|
|
9
|
+
international: string;
|
|
10
|
+
possible: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** An empty allowlist is a configuration error, never an implicit unrestricted selector. */
|
|
14
|
+
export function phoneCountries(countries?: readonly PhoneCountry[]): readonly PhoneCountry[] {
|
|
15
|
+
const supported = new Set(getCountries()), result = [...new Set(countries ?? getCountries())];
|
|
16
|
+
if (!result.length || result.some(country => !supported.has(country))) throw new RangeError("PhoneInput requires supported country codes and a non-empty country list.");
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
/** Unicode flag is decorative; the selector always also names the country and calling code. */
|
|
20
|
+
export function phoneFlag(country: PhoneCountry): string {
|
|
21
|
+
return [...country].map(letter => String.fromCodePoint(127397 + letter.charCodeAt(0))).join("");
|
|
22
|
+
}
|
|
23
|
+
export function phoneCountryName(country: PhoneCountry, locale = "en"): string {
|
|
24
|
+
return new Intl.DisplayNames([locale], { type: "region" }).of(country) ?? country;
|
|
25
|
+
}
|
|
26
|
+
const optionCache = new Map<string, readonly SearchSelectOption[]>();
|
|
27
|
+
/** Search accepts localized/English names, ISO code and calling code. No network or location inference.
|
|
28
|
+
* Before hydration, use ISO ordering/names: host ICU versions can disagree on translations and sort order. */
|
|
29
|
+
export function phoneCountryOptions(countries: readonly PhoneCountry[], locale = "en", localized = true): readonly SearchSelectOption[] {
|
|
30
|
+
const key = `${localized ? locale : "iso"}:${countries.join(",")}`;
|
|
31
|
+
const cached = optionCache.get(key); if (cached) return cached;
|
|
32
|
+
const options = countries.map(country => ({ value: country, label: `${phoneFlag(country)} +${getCountryCallingCode(country)}`,
|
|
33
|
+
description: localized ? phoneCountryName(country, locale) : country, keywords: [country, ...(localized ? [phoneCountryName(country, "en")] : []), getCountryCallingCode(country)] }));
|
|
34
|
+
options.sort((a, b) => localized ? a.description.localeCompare(b.description, locale) : a.value < b.value ? -1 : 1);
|
|
35
|
+
optionCache.set(key, options); return options;
|
|
36
|
+
}
|
|
37
|
+
/** Preserve the actual international prefix when pasting; never silently prepend the old country's code. */
|
|
38
|
+
export function phoneState(text: string, fallback: PhoneCountry): PhoneState {
|
|
39
|
+
const clean = parseIncompletePhoneNumber(text), international = clean.startsWith("+");
|
|
40
|
+
if (!clean || clean === "+") return { country: fallback, display: clean, value: "", international: clean, possible: false };
|
|
41
|
+
const formatter = new AsYouType(fallback), formatted = formatter.input(clean), number = formatter.getNumber();
|
|
42
|
+
const country = formatter.getCountry() ?? fallback;
|
|
43
|
+
const value = String(formatter.getNumberValue() ?? (international ? clean : `+${getCountryCallingCode(fallback)}${clean}`));
|
|
44
|
+
const display = international && formatter.getCountry() && number ? number.formatNational() : formatted;
|
|
45
|
+
const hasExtension = /(?:ext\.?|extension|[#x])\s*\d/i.test(text);
|
|
46
|
+
return { country, display, value, international: number && formatter.getCountry() ? number.formatInternational() : new AsYouType().input(value),
|
|
47
|
+
possible: Boolean(number?.isPossible() && formatter.getCountry() && value.length <= 16 && !hasExtension) };
|
|
48
|
+
}
|
|
49
|
+
export function phoneProblem(state: PhoneState, countries: readonly PhoneCountry[], required: boolean, requiredMessage: string, invalidMessage: string): string {
|
|
50
|
+
return !state.value && !state.display ? (required ? requiredMessage : "") : state.possible && countries.includes(state.country) ? "" : invalidMessage;
|
|
51
|
+
}
|
|
52
|
+
/** Count decimal digits rather than punctuation when preserving a selection through a mask. */
|
|
53
|
+
export function phoneDigitCount(value: string): number { return [...value.matchAll(/\p{Decimal_Number}/gu)].length; }
|
|
54
|
+
export function phoneCaret(display: string, digits: number): number {
|
|
55
|
+
if (!digits) return 0;
|
|
56
|
+
for (let i = 0, count = 0; i < display.length; i++) if (/\p{Decimal_Number}/u.test(display[i]!) && ++count >= digits) return i + 1;
|
|
57
|
+
return display.length;
|
|
58
|
+
}
|
|
59
|
+
/** Delete the adjacent digit when Backspace/Delete would otherwise merely remove an auto-inserted separator. */
|
|
60
|
+
export function phoneSeparatorDeletion(display: string, type: string, start: number, end: number): { text: string; digits: number } | undefined {
|
|
61
|
+
if (start !== end || !["deleteContentBackward", "deleteContentForward"].includes(type)) return;
|
|
62
|
+
const backward = type === "deleteContentBackward", character = display[backward ? start - 1 : start];
|
|
63
|
+
if (!character || /\p{Decimal_Number}/u.test(character)) return;
|
|
64
|
+
const digits = parseIncompletePhoneNumber(display).replace(/\D/g, ""), before = phoneDigitCount(display.slice(0, start));
|
|
65
|
+
const index = backward ? before - 1 : before;
|
|
66
|
+
if (index < 0 || index >= digits.length) return;
|
|
67
|
+
return { text: digits.slice(0, index) + digits.slice(index + 1), digits: backward ? before - 1 : before };
|
|
68
|
+
}
|
|
69
|
+
/** Native editing mechanics shared by both adapters: caret, paste, IME and separator deletion. */
|
|
70
|
+
export function bindPhoneEditing(element: HTMLInputElement, initial: PhoneState, changed: (next: PhoneState, previous: PhoneState) => void) {
|
|
71
|
+
let current = initial, composing = false;
|
|
72
|
+
const blocked = () => element.matches(":disabled");
|
|
73
|
+
function apply(text = element.value, digitPosition = phoneDigitCount(text.slice(0, element.selectionStart ?? text.length))) {
|
|
74
|
+
if (blocked()) return;
|
|
75
|
+
const next = phoneState(text, current.country), previous = current; current = next;
|
|
76
|
+
element.value = next.display;
|
|
77
|
+
const caret = phoneCaret(next.display, digitPosition);
|
|
78
|
+
element.setSelectionRange(caret, caret);
|
|
79
|
+
if (next.value !== previous.value || next.country !== previous.country || next.display !== previous.display) changed(next, previous);
|
|
80
|
+
}
|
|
81
|
+
function input(event: Event) { if (!composing && !(event as InputEvent).isComposing) apply(); }
|
|
82
|
+
function before(event: InputEvent) {
|
|
83
|
+
if (composing || event.isComposing || blocked()) return;
|
|
84
|
+
const deletion = phoneSeparatorDeletion(current.display, event.inputType, element.selectionStart ?? 0, element.selectionEnd ?? 0);
|
|
85
|
+
if (deletion) { event.preventDefault(); apply(deletion.text, deletion.digits); }
|
|
86
|
+
}
|
|
87
|
+
function compositionStart() { composing = true; }
|
|
88
|
+
function compositionEnd() { composing = false; apply(); }
|
|
89
|
+
element.addEventListener("input", input); element.addEventListener("beforeinput", before);
|
|
90
|
+
element.addEventListener("compositionstart", compositionStart); element.addEventListener("compositionend", compositionEnd);
|
|
91
|
+
return {
|
|
92
|
+
sync(next: PhoneState) { current = next; if (!composing && element.value !== next.display) element.value = next.display; },
|
|
93
|
+
destroy() { element.removeEventListener("input", input); element.removeEventListener("beforeinput", before); element.removeEventListener("compositionstart", compositionStart); element.removeEventListener("compositionend", compositionEnd); },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Keep the selected country accurate even when an international paste is outside the allowlist. */
|
|
98
|
+
export function phoneOptions(countries: readonly PhoneCountry[], country: PhoneCountry, locale: string, localized = true) {
|
|
99
|
+
const options = phoneCountryOptions(countries, locale, localized);
|
|
100
|
+
return countries.includes(country) ? options : [...options, { ...phoneCountryOptions([country], locale, localized)[0]!, disabled: true }];
|
|
101
|
+
}
|
|
102
|
+
/** Focus only the first invalid control when native form validation reports several errors. */
|
|
103
|
+
export function phoneInvalid(element: HTMLInputElement) {
|
|
104
|
+
const first = element.form ? [...element.form.elements].find(control => "willValidate" in control && (control as HTMLInputElement).willValidate && !(control as HTMLInputElement).validity.valid) : element;
|
|
105
|
+
if (first === element) element.focus();
|
|
106
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Resolve before the first popup render so native modal portals never mount on body first. */
|
|
2
|
+
export function modalPortalContainer(source: HTMLElement): HTMLElement | undefined {
|
|
3
|
+
return source.closest<HTMLDialogElement>("dialog[open]") ?? undefined;
|
|
4
|
+
}
|
|
5
|
+
/** The portal retains its source's independent appearance axes and native modal boundary. */
|
|
6
|
+
export function observePortalAppearance(source: HTMLElement, changed: (state: { attributes: Record<string, string>; container: HTMLElement | undefined }) => void) {
|
|
7
|
+
const keys = ["data-theme", "data-color-scheme", "data-density"];
|
|
8
|
+
const read = () => changed({
|
|
9
|
+
attributes: Object.fromEntries(keys.flatMap(key => { const value = source.closest(`[${key}]`)?.getAttribute(key); return value == null ? [] : [[key, value]]; })),
|
|
10
|
+
container: modalPortalContainer(source),
|
|
11
|
+
});
|
|
12
|
+
read(); const observer = new MutationObserver(read);
|
|
13
|
+
for (let node: HTMLElement | null = source; node; node = node.parentElement) observer.observe(node, { attributes: true, attributeFilter: [...keys, "open"] });
|
|
14
|
+
return () => observer.disconnect();
|
|
15
|
+
}
|