banhaten 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/CONTRIBUTING.md +44 -0
- package/README.md +65 -13
- package/SECURITY.md +15 -0
- package/banhaten.config.example.json +0 -2
- package/docs/design-system/README.md +9 -0
- package/docs/design-system/adoption-quality-remediation.md +87 -0
- package/docs/design-system/agent-usage.md +13 -0
- package/docs/design-system/appearance-presets.md +6 -1
- package/docs/design-system/component-docs-pattern.md +81 -0
- package/docs/design-system/component-token-consistency-audit.md +13 -3
- package/docs/design-system/components/README.md +3 -2
- package/docs/design-system/components/accordion.md +16 -0
- package/docs/design-system/components/activity-feed.md +15 -1
- package/docs/design-system/components/alert-dialog.md +17 -0
- package/docs/design-system/components/alert.md +46 -14
- package/docs/design-system/components/aspect-ratio.md +15 -0
- package/docs/design-system/components/attribute.md +16 -0
- package/docs/design-system/components/autocomplete.md +19 -0
- package/docs/design-system/components/avatar.md +18 -0
- package/docs/design-system/components/badge.md +19 -0
- package/docs/design-system/components/banner.md +15 -1
- package/docs/design-system/components/breadcrumbs.md +14 -0
- package/docs/design-system/components/button-group.md +34 -0
- package/docs/design-system/components/button.md +18 -0
- package/docs/design-system/components/card.md +18 -1
- package/docs/design-system/components/carousel.md +20 -3
- package/docs/design-system/components/catalog-components.md +15 -1
- package/docs/design-system/components/chart.md +15 -0
- package/docs/design-system/components/checkbox.md +16 -0
- package/docs/design-system/components/collapsible.md +15 -0
- package/docs/design-system/components/command.md +15 -0
- package/docs/design-system/components/context-menu.md +15 -0
- package/docs/design-system/components/date-picker.md +21 -1
- package/docs/design-system/components/divider.md +16 -0
- package/docs/design-system/components/empty-state.md +17 -0
- package/docs/design-system/components/field.md +17 -0
- package/docs/design-system/components/file-upload.md +14 -0
- package/docs/design-system/components/hover-card.md +15 -0
- package/docs/design-system/components/input-group.md +17 -0
- package/docs/design-system/components/input-otp.md +18 -0
- package/docs/design-system/components/input.md +43 -7
- package/docs/design-system/components/item.md +72 -0
- package/docs/design-system/components/kbd.md +18 -0
- package/docs/design-system/components/label.md +16 -0
- package/docs/design-system/components/menu.md +17 -0
- package/docs/design-system/components/menubar.md +15 -0
- package/docs/design-system/components/modal.md +25 -4
- package/docs/design-system/components/native-select.md +18 -0
- package/docs/design-system/components/navigation-menu.md +15 -0
- package/docs/design-system/components/onboarding-step-list-item.md +15 -1
- package/docs/design-system/components/page-header.md +15 -1
- package/docs/design-system/components/pagination.md +30 -8
- package/docs/design-system/components/popover.md +19 -0
- package/docs/design-system/components/progress-slider.md +18 -0
- package/docs/design-system/components/progress.md +17 -0
- package/docs/design-system/components/radio-card.md +16 -0
- package/docs/design-system/components/radio-group.md +17 -0
- package/docs/design-system/components/resizable.md +15 -0
- package/docs/design-system/components/scroll-area.md +15 -0
- package/docs/design-system/components/segmented-control.md +71 -0
- package/docs/design-system/components/select.md +44 -7
- package/docs/design-system/components/sheet.md +17 -0
- package/docs/design-system/components/sidebar.md +15 -0
- package/docs/design-system/components/skeleton.md +18 -0
- package/docs/design-system/components/slideout.md +14 -0
- package/docs/design-system/components/slider.md +20 -0
- package/docs/design-system/components/social-button.md +21 -3
- package/docs/design-system/components/spinner.md +16 -0
- package/docs/design-system/components/steps.md +14 -0
- package/docs/design-system/components/table.md +15 -1
- package/docs/design-system/components/tabs.md +17 -0
- package/docs/design-system/components/tag.md +17 -0
- package/docs/design-system/components/textarea.md +16 -0
- package/docs/design-system/components/timeline.md +14 -0
- package/docs/design-system/components/toast.md +17 -0
- package/docs/design-system/components/toggle.md +17 -0
- package/docs/design-system/components/toolbar.md +21 -1
- package/docs/design-system/components/tooltip.md +18 -1
- package/docs/design-system/density-and-elevation.md +44 -0
- package/docs/design-system/direction-and-localization.md +23 -0
- package/docs/design-system/form-recipes.md +73 -0
- package/docs/design-system/gap-promotion-policy.md +21 -0
- package/docs/design-system/gap-promotion-report.md +166 -0
- package/docs/design-system/installation.md +68 -0
- package/docs/design-system/launch-comparison-shadcn.md +98 -0
- package/docs/design-system/registry-and-cli.md +30 -7
- package/docs/design-system/release-policy.md +30 -0
- package/docs/design-system/roadmap.md +14 -0
- package/docs/design-system/support-matrix.md +23 -0
- package/docs/design-system/tabs.md +1 -1
- package/docs/design-system/token-governance.md +23 -1
- package/package.json +29 -15
- package/registry/component-contract.json +40 -0
- package/registry/components/alert-dialog.tsx +1 -1
- package/registry/components/alert.tsx +86 -65
- package/registry/components/autocomplete.tsx +23 -9
- package/registry/components/avatar.tsx +7 -7
- package/registry/components/badge.tsx +1 -1
- package/registry/components/button-group.tsx +321 -4
- package/registry/components/button.tsx +38 -17
- package/registry/components/card.tsx +68 -59
- package/registry/components/carousel.tsx +53 -5
- package/registry/components/chart.tsx +36 -3
- package/registry/components/checkbox.tsx +3 -3
- package/registry/components/collapsible.tsx +1 -1
- package/registry/components/command.tsx +1 -1
- package/registry/components/context-menu.tsx +1 -1
- package/registry/components/date-picker.tsx +245 -104
- package/registry/components/expanded/ActivityFeed.tsx +6 -15
- package/registry/components/expanded/Banner.tsx +3 -3
- package/registry/components/expanded/Breadcrumbs.tsx +5 -5
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +13 -13
- package/registry/components/expanded/CatalogDivider.tsx +1 -1
- package/registry/components/expanded/EmptyState.tsx +1 -1
- package/registry/components/expanded/FileUpload.tsx +9 -2
- package/registry/components/expanded/OnboardingStepListItem.tsx +2 -4
- package/registry/components/expanded/PageHeader.tsx +13 -13
- package/registry/components/expanded/Slideout.tsx +15 -415
- package/registry/components/expanded/Steps.tsx +4 -4
- package/registry/components/expanded/Table.tsx +116 -69
- package/registry/components/expanded/Timeline.tsx +3 -3
- package/registry/components/expanded/activityFeed.css +1 -1
- package/registry/components/expanded/breadcrumbs.css +1 -1
- package/registry/components/expanded/divider.css +1 -1
- package/registry/components/expanded/emptyState.css +1 -1
- package/registry/components/expanded/fileUpload.css +6 -6
- package/registry/components/expanded/slideout.css +9 -685
- package/registry/components/expanded/steps.css +3 -3
- package/registry/components/expanded/table.css +2 -2
- package/registry/components/expanded/timeline.css +2 -2
- package/registry/components/input-content.ts +1 -0
- package/registry/components/input-otp.tsx +13 -3
- package/registry/components/input.tsx +68 -43
- package/registry/components/item.tsx +189 -0
- package/registry/components/kbd.tsx +111 -4
- package/registry/components/menu.tsx +31 -245
- package/registry/components/menubar.tsx +1 -1
- package/registry/components/modal.tsx +142 -102
- package/registry/components/native-select.tsx +2 -2
- package/registry/components/pagination.tsx +80 -58
- package/registry/components/popover.tsx +162 -664
- package/registry/components/radio-card.tsx +116 -87
- package/registry/components/segmented-control.tsx +87 -0
- package/registry/components/select-content.tsx +2 -2
- package/registry/components/select.tsx +52 -16
- package/registry/components/sheet.tsx +1 -1
- package/registry/components/sidebar.tsx +1 -1
- package/registry/components/skeleton.css +0 -3
- package/registry/components/social-button.tsx +47 -25
- package/registry/components/spinner.tsx +18 -55
- package/registry/components/tabs.css +1 -1
- package/registry/components/tabs.tsx +8 -4
- package/registry/components/tag.tsx +2 -2
- package/registry/components/textarea.tsx +3 -3
- package/registry/components/toast.tsx +16 -11
- package/registry/components/toggle.tsx +2 -2
- package/registry/components/toolbar.tsx +89 -17
- package/registry/components/tooltip.tsx +1 -1
- package/registry/examples/alert-demo.tsx +25 -5
- package/registry/examples/attribute-demo.tsx +1 -1
- package/registry/examples/autocomplete-demo.tsx +3 -3
- package/registry/examples/avatar-demo.tsx +7 -7
- package/registry/examples/badge-demo.tsx +1 -1
- package/registry/examples/button-demo.tsx +6 -6
- package/registry/examples/button-group-demo.tsx +23 -2
- package/registry/examples/card-demo.tsx +46 -8
- package/registry/examples/carousel-demo.tsx +20 -2
- package/registry/examples/chart-demo.tsx +1 -1
- package/registry/examples/checkbox-demo.tsx +5 -5
- package/registry/examples/collection-filter-bar-demo.tsx +135 -0
- package/registry/examples/command-demo.tsx +3 -3
- package/registry/examples/{expanded/command-bar-demo.tsx → command-palette-demo.tsx} +5 -15
- package/registry/examples/context-menu-demo.tsx +1 -1
- package/registry/examples/control-density-contract-demo.tsx +61 -0
- package/registry/examples/date-picker-demo.tsx +12 -12
- package/registry/examples/divider-demo.tsx +3 -3
- package/registry/examples/expanded/banner-demo.tsx +1 -1
- package/registry/examples/expanded/breadcrumbs-demo.tsx +1 -1
- package/registry/examples/expanded/empty-state-demo.tsx +1 -1
- package/registry/examples/expanded/file-upload-demo.tsx +1 -1
- package/registry/examples/expanded/onboarding-step-demo.tsx +1 -1
- package/registry/examples/expanded/slideout-demo.tsx +2 -2
- package/registry/examples/expanded/steps-demo.tsx +1 -1
- package/registry/examples/expanded/tabs-demo.tsx +1 -1
- package/registry/examples/expanded/timeline-demo.tsx +1 -1
- package/registry/examples/hover-card-demo.tsx +2 -2
- package/registry/examples/input-demo.tsx +6 -6
- package/registry/examples/input-otp-demo.tsx +4 -4
- package/registry/examples/item-demo.tsx +46 -0
- package/registry/examples/kbd-demo.tsx +1 -1
- package/registry/examples/label-demo.tsx +1 -1
- package/registry/examples/menu-demo.tsx +1 -1
- package/registry/examples/modal-demo.tsx +67 -9
- package/registry/examples/navigation-menu-demo.tsx +1 -1
- package/registry/examples/pagination-demo.tsx +6 -3
- package/registry/examples/popover-demo.tsx +19 -19
- package/registry/examples/progress-demo.tsx +1 -1
- package/registry/examples/progress-slider-demo.tsx +1 -1
- package/registry/examples/radio-card-demo.tsx +4 -4
- package/registry/examples/radio-group-demo.tsx +2 -2
- package/registry/examples/resizable-demo.tsx +1 -1
- package/registry/examples/results-toolbar-demo.tsx +44 -0
- package/registry/examples/scroll-area-demo.tsx +3 -3
- package/registry/examples/segmented-control-demo.tsx +39 -0
- package/registry/examples/select-demo.tsx +1 -1
- package/registry/examples/sidebar-demo.tsx +1 -1
- package/registry/examples/slider-demo.tsx +3 -3
- package/registry/examples/social-button-demo.tsx +18 -8
- package/registry/examples/spinner-demo.tsx +13 -13
- package/registry/examples/tabs-demo.tsx +1 -1
- package/registry/examples/tag-demo.tsx +1 -1
- package/registry/examples/textarea-demo.tsx +4 -4
- package/registry/examples/toast-demo.tsx +1 -1
- package/registry/examples/toggle-demo.tsx +6 -6
- package/registry/examples/tooltip-demo.tsx +4 -4
- package/registry/guidance/USAGE.md +27 -0
- package/registry/hooks/use-direction.ts +193 -13
- package/registry/index.json +5311 -377
- package/registry/styles/globals.css +2440 -4061
- package/registry.json +119 -149
- package/schema/config.schema.json +11 -8
- package/schema/registry.schema.json +150 -45
- package/schema/tokens.schema.json +134 -34
- package/src/cli/command-line.js +194 -0
- package/src/cli/config-editors.js +9 -0
- package/src/cli/doctor.js +399 -0
- package/src/cli/file-transaction.js +295 -0
- package/src/cli/global-css.js +153 -0
- package/src/cli/index.js +567 -1613
- package/src/cli/install-plan.js +592 -0
- package/src/cli/install-receipt.js +171 -0
- package/src/cli/jsonc.js +203 -0
- package/src/cli/package-install-state.js +254 -0
- package/src/cli/package-manager.js +238 -0
- package/src/cli/package-plan.js +185 -0
- package/src/cli/package-version.js +97 -0
- package/src/cli/registry-query.js +207 -0
- package/src/cli/reporting.js +55 -0
- package/src/cli/schema-validation.js +19 -0
- package/src/cli/source-scanner.js +686 -0
- package/src/cli/vite-config.js +478 -0
- package/tokens/banhaten.tokens.json +4312 -309
- package/docs/design-system/components/command-bar.md +0 -57
- package/registry/components/expanded/BannerBoard.tsx +0 -225
- package/registry/components/expanded/CatalogTag.tsx +0 -85
- package/registry/components/expanded/CommandBar.tsx +0 -386
- package/registry/components/expanded/IconExplorer.tsx +0 -612
- package/registry/components/expanded/TimelineShowcase.tsx +0 -158
- package/registry/components/expanded/commandBar.css +0 -470
- package/registry/components/expanded/iconExplorer.css +0 -764
- package/registry/components/expanded/iconPacks.ts +0 -866
- package/registry/components/expanded/tag.css +0 -148
- package/registry/examples/expanded/icons-demo.tsx +0 -5
- package/tokens/Color mode.zip +0 -0
- package/tokens/Numbers.zip +0 -0
- package/tokens/Radius.zip +0 -0
- package/tokens/Theme.zip +0 -0
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# Command Bar
|
|
2
|
-
|
|
3
|
-
Command Bar gives users a keyboard-friendly command palette with search, recent items, filtered results, and empty states.
|
|
4
|
-
|
|
5
|
-
The implementation follows the Figma component at `Design system 3.0 Copy / CommandBar` (`259:4097`). It supports `default`, `recent`, `results`, and `no-result`; `desktop` and `mobile`; LTR and RTL.
|
|
6
|
-
|
|
7
|
-
## API
|
|
8
|
-
|
|
9
|
-
```tsx
|
|
10
|
-
<CommandBar type="results" breakpoint="desktop" dir="ltr" />
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
| Prop | Values | Default |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| `type` | `default`, `recent`, `results`, `no-result` | `default` |
|
|
16
|
-
| `breakpoint` | `desktop`, `mobile` | `desktop` |
|
|
17
|
-
| `dir` | `ltr`, `rtl` | `ltr` |
|
|
18
|
-
|
|
19
|
-
## Token Contract
|
|
20
|
-
|
|
21
|
-
The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into `registry/styles/globals.css` as a `--bh-*` token or alias first.
|
|
22
|
-
|
|
23
|
-
- Backgrounds: `--bh-bg-raised`, `--bh-bg-neutral-soft`, `--bh-bg-neutral-subtle`
|
|
24
|
-
- Borders: `--bh-border-default`, `--bh-border-input`, `--bh-border-subtle`
|
|
25
|
-
- Content: `--bh-content-default`, `--bh-content-muted`, `--bh-content-subtle`
|
|
26
|
-
- Shape: `--bh-radius-md-6`, `--bh-radius-lg-8`, `--bh-radius-3xl-16`, `--bh-radius-full`
|
|
27
|
-
|
|
28
|
-
## Pixel Rules
|
|
29
|
-
|
|
30
|
-
- Text is Inter `15px / 24px`; item descriptions are `12px / 16px`.
|
|
31
|
-
- Desktop command bars are `640px` wide with `16px` radius and `Shadow/xl`.
|
|
32
|
-
- Mobile command bars are `375px x 812px`, flush-edged, with an inset search field.
|
|
33
|
-
- Desktop search rows are `60px` high; mobile search fields are `48px`.
|
|
34
|
-
- Expanded desktop content uses a clipped results area and a `48px` footer for recent/results.
|
|
35
|
-
- Result filters use `36px` chips with `12px` horizontal padding.
|
|
36
|
-
- Items use `32px` leading visuals, `12px` gaps, and a `56px` minimum row height.
|
|
37
|
-
- RTL mirrors row order and uses Arabic labels from the Figma variants.
|
|
38
|
-
|
|
39
|
-
## Install
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
npx banhaten add command-bar
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Examples
|
|
46
|
-
|
|
47
|
-
Primary registry example: `examples/expanded/command-bar-demo.tsx`.
|
|
48
|
-
|
|
49
|
-
Open the live component page or run `npx banhaten docs command-bar` to inspect source files, install command, and examples.
|
|
50
|
-
|
|
51
|
-
## RTL Rules
|
|
52
|
-
|
|
53
|
-
This component has no special RTL contract beyond inherited document direction and logical spacing.
|
|
54
|
-
|
|
55
|
-
## Accessibility
|
|
56
|
-
|
|
57
|
-
Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Banner,
|
|
3
|
-
type BannerColor,
|
|
4
|
-
type BannerContent,
|
|
5
|
-
type BannerDirection,
|
|
6
|
-
type BannerSize,
|
|
7
|
-
type BannerType,
|
|
8
|
-
} from "./Banner";
|
|
9
|
-
|
|
10
|
-
type BannerSpec = {
|
|
11
|
-
id: string;
|
|
12
|
-
name: string;
|
|
13
|
-
x: number;
|
|
14
|
-
y: number;
|
|
15
|
-
width: number;
|
|
16
|
-
height: number;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
type ParsedBannerSpec = BannerSpec & {
|
|
20
|
-
color: BannerColor;
|
|
21
|
-
content: BannerContent;
|
|
22
|
-
dir: BannerDirection;
|
|
23
|
-
size: BannerSize;
|
|
24
|
-
type: BannerType;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const figmaTypeToProp: Record<string, BannerType> = {
|
|
28
|
-
Slim: "slim",
|
|
29
|
-
"Single action inline": "single-action-inline",
|
|
30
|
-
"Single action": "single-action",
|
|
31
|
-
Input: "input",
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const figmaSizeToProp: Record<string, BannerSize> = {
|
|
35
|
-
Floating: "floating",
|
|
36
|
-
"Full width": "full-width",
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const figmaContentToProp: Record<string, BannerContent> = {
|
|
40
|
-
Title: "title",
|
|
41
|
-
"Title + Description": "title-description",
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const figmaColorToProp: Record<string, BannerColor> = {
|
|
45
|
-
Brand: "brand",
|
|
46
|
-
Grey: "grey",
|
|
47
|
-
"Brand Light": "brand-light",
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const bannerSpecs: BannerSpec[] = [
|
|
51
|
-
{ id: "237:39514", name: "type=Single action, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 377, width: 1440, height: 60 },
|
|
52
|
-
{ id: "237:39521", name: "type=Single action, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 1144.8330078125, width: 1440, height: 60 },
|
|
53
|
-
{ id: "237:39528", name: "type=Single action, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 1964.8330078125, width: 1440, height: 60 },
|
|
54
|
-
{ id: "237:39543", name: "type=Single action, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 1228.8330078125, width: 1440, height: 60 },
|
|
55
|
-
{ id: "237:39553", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 2048.8330078125, width: 1440, height: 60 },
|
|
56
|
-
{ id: "237:39574", name: "type=Input, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 566, width: 1440, height: 60 },
|
|
57
|
-
{ id: "237:39583", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 644, width: 1440, height: 60 },
|
|
58
|
-
{ id: "237:39595", name: "type=Input, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 1341.8330078125, width: 1440, height: 60 },
|
|
59
|
-
{ id: "237:39604", name: "type=Input, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 2161.8330078125, width: 1440, height: 60 },
|
|
60
|
-
{ id: "237:39623", name: "type=Input, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 1416.999755859375, width: 1440, height: 60 },
|
|
61
|
-
{ id: "237:39635", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 2236.999755859375, width: 1440, height: 60 },
|
|
62
|
-
{ id: "237:39660", name: "type=Slim, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 63, width: 1440, height: 48 },
|
|
63
|
-
{ id: "237:39666", name: "type=Slim, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 806.5, width: 1440, height: 48 },
|
|
64
|
-
{ id: "237:39672", name: "type=Slim, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 1617.3330078125, width: 1440, height: 48 },
|
|
65
|
-
{ id: "237:39685", name: "type=Slim, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 884.5, width: 1440, height: 52 },
|
|
66
|
-
{ id: "237:39694", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 1695.3330078125, width: 1440, height: 52 },
|
|
67
|
-
{ id: "237:39713", name: "type=Single action, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 377, width: 1217, height: 60 },
|
|
68
|
-
{ id: "237:39720", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 458, width: 1217, height: 60 },
|
|
69
|
-
{ id: "237:39730", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 458, width: 1440, height: 60 },
|
|
70
|
-
{ id: "237:39740", name: "type=Single action, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 1144.8330078125, width: 1217, height: 64 },
|
|
71
|
-
{ id: "237:39747", name: "type=Single action, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 1964.8330078125, width: 1217, height: 60 },
|
|
72
|
-
{ id: "237:39762", name: "type=Single action, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 1228.8330078125, width: 1217, height: 64 },
|
|
73
|
-
{ id: "237:39772", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 2048.8330078125, width: 1217, height: 60 },
|
|
74
|
-
{ id: "237:39793", name: "type=Slim, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 63, width: 1217, height: 48 },
|
|
75
|
-
{ id: "237:39799", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 210, width: 1217, height: 60 },
|
|
76
|
-
{ id: "237:39805", name: "type=Single action inline, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 973.41650390625, width: 1217, height: 60 },
|
|
77
|
-
{ id: "237:39811", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 1784.25, width: 1217, height: 60 },
|
|
78
|
-
{ id: "237:39824", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 210, width: 1440, height: 60 },
|
|
79
|
-
{ id: "237:39830", name: "type=Single action inline, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 973.41650390625, width: 1440, height: 60 },
|
|
80
|
-
{ id: "237:39836", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 1784.25, width: 1440, height: 60 },
|
|
81
|
-
{ id: "237:39849", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 210, width: 1217, height: 60 },
|
|
82
|
-
{ id: "237:39855", name: "type=Single action inline, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 972.249755859375, width: 1217, height: 60 },
|
|
83
|
-
{ id: "237:39861", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 1784.25, width: 1217, height: 60 },
|
|
84
|
-
{ id: "237:39874", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 210, width: 1440, height: 60 },
|
|
85
|
-
{ id: "237:39880", name: "type=Single action inline, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 972.249755859375, width: 1440, height: 60 },
|
|
86
|
-
{ id: "237:39886", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 1784.25, width: 1440, height: 60 },
|
|
87
|
-
{ id: "237:39899", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 134, width: 1217, height: 52 },
|
|
88
|
-
{ id: "237:39908", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 291, width: 1217, height: 60 },
|
|
89
|
-
{ id: "237:39917", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 1054.41650390625, width: 1217, height: 60 },
|
|
90
|
-
{ id: "237:39926", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 1865.25, width: 1217, height: 60 },
|
|
91
|
-
{ id: "237:39945", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 291, width: 1440, height: 60 },
|
|
92
|
-
{ id: "237:39954", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 1054.41650390625, width: 1440, height: 60 },
|
|
93
|
-
{ id: "237:39963", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 1865.25, width: 1440, height: 60 },
|
|
94
|
-
{ id: "237:39982", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 291, width: 1217, height: 60 },
|
|
95
|
-
{ id: "237:39991", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 1053.249755859375, width: 1217, height: 60 },
|
|
96
|
-
{ id: "237:40000", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 1865.25, width: 1217, height: 60 },
|
|
97
|
-
{ id: "237:40019", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 291, width: 1440, height: 60 },
|
|
98
|
-
{ id: "237:40028", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 1053.249755859375, width: 1440, height: 60 },
|
|
99
|
-
{ id: "237:40037", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 1865.25, width: 1440, height: 60 },
|
|
100
|
-
{ id: "237:40056", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 134, width: 1217, height: 52 },
|
|
101
|
-
{ id: "237:40065", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 134, width: 1440, height: 52 },
|
|
102
|
-
{ id: "237:40074", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 134, width: 1440, height: 52 },
|
|
103
|
-
{ id: "237:40083", name: "type=Slim, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 820.5, width: 1217, height: 48 },
|
|
104
|
-
{ id: "237:40089", name: "type=Slim, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 1631.3330078125, width: 1217, height: 48 },
|
|
105
|
-
{ id: "237:40103", name: "type=Slim, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 892.5, width: 1217, height: 52 },
|
|
106
|
-
{ id: "237:40112", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 1703.3330078125, width: 1217, height: 52 },
|
|
107
|
-
{ id: "237:40132", name: "type=Input, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 558, width: 1217, height: 60 },
|
|
108
|
-
{ id: "237:40141", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 639, width: 1217, height: 60 },
|
|
109
|
-
{ id: "237:40153", name: "type=Input, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 1341.8330078125, width: 1217, height: 60 },
|
|
110
|
-
{ id: "237:40162", name: "type=Input, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 2161.8330078125, width: 1217, height: 60 },
|
|
111
|
-
{ id: "237:40181", name: "type=Input, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 1422.8330078125, width: 1217, height: 60 },
|
|
112
|
-
{ id: "237:40193", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 2242.8330078125, width: 1217, height: 60 },
|
|
113
|
-
{ id: "237:40218", name: "type=Single action, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 369.1666259765625, width: 1440, height: 60 },
|
|
114
|
-
{ id: "237:40225", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 450.1666259765625, width: 1440, height: 60 },
|
|
115
|
-
{ id: "237:40235", name: "type=Single action, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 1141.8330078125, width: 1440, height: 60 },
|
|
116
|
-
{ id: "237:40242", name: "type=Single action, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 1961.8330078125, width: 1440, height: 60 },
|
|
117
|
-
{ id: "237:40257", name: "type=Single action, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 1217.8330078125, width: 1440, height: 60 },
|
|
118
|
-
{ id: "237:40267", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 2037.8330078125, width: 1440, height: 60 },
|
|
119
|
-
{ id: "237:40288", name: "type=Input, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 550, width: 1440, height: 60 },
|
|
120
|
-
{ id: "237:40297", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 628, width: 1440, height: 60 },
|
|
121
|
-
{ id: "237:40309", name: "type=Input, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 1340.8330078125, width: 1440, height: 60 },
|
|
122
|
-
{ id: "237:40318", name: "type=Input, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 2160.8330078125, width: 1440, height: 60 },
|
|
123
|
-
{ id: "237:40337", name: "type=Input, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 1422.8330078125, width: 1440, height: 60 },
|
|
124
|
-
{ id: "237:40349", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 2242.8330078125, width: 1440, height: 60 },
|
|
125
|
-
{ id: "237:40374", name: "type=Slim, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 63, width: 1440, height: 48 },
|
|
126
|
-
{ id: "237:40380", name: "type=Slim, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 786.5, width: 1440, height: 48 },
|
|
127
|
-
{ id: "237:40386", name: "type=Slim, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 1597.3330078125, width: 1440, height: 48 },
|
|
128
|
-
{ id: "237:40399", name: "type=Slim, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 874.3330078125, width: 1440, height: 52 },
|
|
129
|
-
{ id: "237:40408", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 1685.166015625, width: 1440, height: 52 },
|
|
130
|
-
{ id: "237:40427", name: "type=Single action, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 369.1666259765625, width: 1217, height: 60 },
|
|
131
|
-
{ id: "237:40434", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 450.1666259765625, width: 1217, height: 60 },
|
|
132
|
-
{ id: "237:40444", name: "type=Single action, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 1142.8330078125, width: 1217, height: 60 },
|
|
133
|
-
{ id: "237:40451", name: "type=Single action, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 1962.8330078125, width: 1217, height: 60 },
|
|
134
|
-
{ id: "237:40466", name: "type=Single action, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 1225.8330078125, width: 1217, height: 60 },
|
|
135
|
-
{ id: "237:40476", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 2045.8330078125, width: 1217, height: 60 },
|
|
136
|
-
{ id: "237:40497", name: "type=Slim, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 63, width: 1217, height: 48 },
|
|
137
|
-
{ id: "237:40503", name: "type=Slim, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 798.5, width: 1217, height: 48 },
|
|
138
|
-
{ id: "237:40509", name: "type=Slim, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 1609.3330078125, width: 1217, height: 48 },
|
|
139
|
-
{ id: "237:40523", name: "type=Slim, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 874.5, width: 1217, height: 52 },
|
|
140
|
-
{ id: "237:40532", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 1685.3330078125, width: 1217, height: 52 },
|
|
141
|
-
{ id: "237:40552", name: "type=Input, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 560, width: 1217, height: 60 },
|
|
142
|
-
{ id: "237:40561", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 636, width: 1217, height: 60 },
|
|
143
|
-
{ id: "237:40573", name: "type=Input, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 1337.8330078125, width: 1217, height: 60 },
|
|
144
|
-
{ id: "237:40582", name: "type=Input, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 2157.8330078125, width: 1217, height: 60 },
|
|
145
|
-
{ id: "237:40601", name: "type=Input, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 1417, width: 1217, height: 60 },
|
|
146
|
-
{ id: "237:40613", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 2237, width: 1217, height: 60 },
|
|
147
|
-
];
|
|
148
|
-
|
|
149
|
-
function getField(name: string, field: string) {
|
|
150
|
-
const match = name.match(new RegExp(`${field}=([^,]+)`));
|
|
151
|
-
if (!match) throw new Error(`Missing ${field} in ${name}`);
|
|
152
|
-
return match[1];
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function parseBannerSpec(spec: BannerSpec): ParsedBannerSpec {
|
|
156
|
-
const type = figmaTypeToProp[getField(spec.name, "type")];
|
|
157
|
-
const size = figmaSizeToProp[getField(spec.name, "Size")];
|
|
158
|
-
const content = figmaContentToProp[getField(spec.name, "Content")];
|
|
159
|
-
const color = figmaColorToProp[getField(spec.name, "color")];
|
|
160
|
-
|
|
161
|
-
if (!type || !size || !content || !color) {
|
|
162
|
-
throw new Error(`Unsupported Banner variant: ${spec.name}`);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return {
|
|
166
|
-
...spec,
|
|
167
|
-
color,
|
|
168
|
-
content,
|
|
169
|
-
dir: getField(spec.name, "RTL") === "True" ? "rtl" : "ltr",
|
|
170
|
-
size,
|
|
171
|
-
type,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const parsedBannerSpecs = bannerSpecs.map(parseBannerSpec);
|
|
176
|
-
|
|
177
|
-
function getBannerDemoCopy(dir: BannerDirection) {
|
|
178
|
-
const rtl = dir === "rtl";
|
|
179
|
-
|
|
180
|
-
return {
|
|
181
|
-
actionLabel: rtl ? "\u062a\u0637\u0628\u064a\u0642" : "Button",
|
|
182
|
-
closeLabel: rtl ? "\u0625\u063a\u0644\u0627\u0642" : "Dismiss banner",
|
|
183
|
-
description: rtl
|
|
184
|
-
? "\u0627\u0643\u062a\u0634\u0641 \u0622\u062e\u0631 \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u0627\u062a \u0641\u064a \u0625\u0635\u062f\u0627\u0631\u0646\u0627 \u0627\u0644\u062c\u062f\u064a\u062f"
|
|
185
|
-
: "Discover the Latest Updates in Our New Release",
|
|
186
|
-
inputAriaLabel: rtl ? "\u062d\u0642\u0644 \u0627\u0644\u0628\u0627\u0646\u0631" : "Banner input",
|
|
187
|
-
inputPlaceholder: rtl ? "\u0627\u0644\u0646\u0635" : "Placeholder",
|
|
188
|
-
linkLabel: rtl ? "\u0627\u0644\u0631\u0627\u0628\u0637" : "Link button",
|
|
189
|
-
title: rtl ? "\u0623\u062e\u0628\u0627\u0631 \u0645\u0647\u0645\u0629!" : "Big news!",
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export function BannerBoard() {
|
|
194
|
-
return (
|
|
195
|
-
<section className="banner-page" aria-label="Design system banner implementation">
|
|
196
|
-
<div className="figma-banner-board" aria-label="Figma Banner component matrix">
|
|
197
|
-
{parsedBannerSpecs.map((spec) => (
|
|
198
|
-
<div
|
|
199
|
-
className="figma-board__item figma-board__item--banner"
|
|
200
|
-
data-figma-name={spec.name}
|
|
201
|
-
data-node-id={spec.id}
|
|
202
|
-
key={spec.id}
|
|
203
|
-
style={{
|
|
204
|
-
left: spec.x,
|
|
205
|
-
top: spec.y,
|
|
206
|
-
width: spec.width,
|
|
207
|
-
height: spec.height,
|
|
208
|
-
}}
|
|
209
|
-
>
|
|
210
|
-
<Banner
|
|
211
|
-
{...getBannerDemoCopy(spec.dir)}
|
|
212
|
-
ariaLabel={`${spec.dir.toUpperCase()} ${spec.color} ${spec.type} banner`}
|
|
213
|
-
color={spec.color}
|
|
214
|
-
content={spec.content}
|
|
215
|
-
dir={spec.dir}
|
|
216
|
-
showInlineAction={!(spec.type === "slim" && spec.color === "brand-light")}
|
|
217
|
-
size={spec.size}
|
|
218
|
-
type={spec.type}
|
|
219
|
-
/>
|
|
220
|
-
</div>
|
|
221
|
-
))}
|
|
222
|
-
</div>
|
|
223
|
-
</section>
|
|
224
|
-
);
|
|
225
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
2
|
-
import { PlusIcon as LucidePlusIcon, XIcon } from "lucide-react";
|
|
3
|
-
import "./tag.css";
|
|
4
|
-
|
|
5
|
-
export type TagType = "simple" | "dot" | "flag" | "avatar" | "icon";
|
|
6
|
-
export type TagSize = "xs" | "md" | "lg";
|
|
7
|
-
export type TagState = "default" | "active" | "disabled";
|
|
8
|
-
|
|
9
|
-
export type CatalogTagType = TagType;
|
|
10
|
-
export type CatalogTagSize = TagSize;
|
|
11
|
-
export type CatalogTagState = TagState;
|
|
12
|
-
|
|
13
|
-
export type CatalogTagProps = {
|
|
14
|
-
avatar?: ReactNode;
|
|
15
|
-
children?: ReactNode;
|
|
16
|
-
closeLabel?: string;
|
|
17
|
-
dir?: "ltr" | "rtl" | "auto";
|
|
18
|
-
disabled?: boolean;
|
|
19
|
-
flag?: ReactNode;
|
|
20
|
-
icon?: ReactNode;
|
|
21
|
-
onClose?: () => void;
|
|
22
|
-
showCloseButton?: boolean;
|
|
23
|
-
size?: TagSize;
|
|
24
|
-
state?: TagState;
|
|
25
|
-
type?: TagType;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
function cx(...classes: Array<string | false | undefined>) {
|
|
29
|
-
return classes.filter(Boolean).join(" ");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function CatalogTag({
|
|
33
|
-
avatar,
|
|
34
|
-
children,
|
|
35
|
-
closeLabel,
|
|
36
|
-
dir = "ltr",
|
|
37
|
-
disabled = false,
|
|
38
|
-
flag,
|
|
39
|
-
icon,
|
|
40
|
-
onClose,
|
|
41
|
-
showCloseButton = false,
|
|
42
|
-
size = "md",
|
|
43
|
-
state = "default",
|
|
44
|
-
type = "simple",
|
|
45
|
-
}: CatalogTagProps) {
|
|
46
|
-
const isDisabled = disabled || state === "disabled";
|
|
47
|
-
const hasLeadingSlot = type !== "simple";
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<span
|
|
51
|
-
aria-disabled={isDisabled || undefined}
|
|
52
|
-
className={cx(
|
|
53
|
-
"ds-tag",
|
|
54
|
-
`ds-tag--${type}`,
|
|
55
|
-
`ds-tag--${size}`,
|
|
56
|
-
`ds-tag--${state}`,
|
|
57
|
-
showCloseButton && "ds-tag--closeable",
|
|
58
|
-
)}
|
|
59
|
-
dir={dir}
|
|
60
|
-
>
|
|
61
|
-
{hasLeadingSlot && (
|
|
62
|
-
<span aria-hidden="true" className="ds-tag__leading">
|
|
63
|
-
{type === "dot" && <span className="ds-tag__dot" />}
|
|
64
|
-
{type === "flag" && (flag ?? <span className="ds-tag__flag" />)}
|
|
65
|
-
{type === "avatar" && <span className="ds-tag__avatar">{avatar}</span>}
|
|
66
|
-
{type === "icon" && (icon ?? <PlusIcon />)}
|
|
67
|
-
</span>
|
|
68
|
-
)}
|
|
69
|
-
<span className="ds-tag__label">{children}</span>
|
|
70
|
-
{showCloseButton && (
|
|
71
|
-
<button aria-label={closeLabel} className="ds-tag__close" disabled={isDisabled} onClick={onClose} type="button">
|
|
72
|
-
<CloseIcon />
|
|
73
|
-
</button>
|
|
74
|
-
)}
|
|
75
|
-
</span>
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function PlusIcon() {
|
|
80
|
-
return <LucidePlusIcon aria-hidden="true" strokeWidth={2.25} />;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function CloseIcon() {
|
|
84
|
-
return <XIcon aria-hidden="true" strokeWidth={2.25} />;
|
|
85
|
-
}
|