@utopia-studio-design/design-system-cli 0.3.0 → 0.3.2
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/README.md +2 -0
- package/bin/utopia-ds-mcp.mjs +5 -3
- package/bin/utopia-ds.mjs +64 -24
- package/data/docs/community-template-contributions.md +85 -0
- package/data/docs/foundations.md +24 -4
- package/data/docs/guide.md +49 -0
- package/data/manifests/catalog.json +6 -3
- package/data/manifests/community-template.schema.json +51 -0
- package/data/manifests/components.json +88 -7
- package/data/manifests/motion-profiles.json +121 -0
- package/data/manifests/theme-barrier-intelligence.json +83 -4
- package/data/manifests/theme-dextrum.json +140 -180
- package/data/manifests/theme-utopia-default.json +40 -5
- package/data/manifests/themes.json +33 -16
- package/data/templates/saas-solution-homepage/main.tsx +6 -2
- package/lib/api.mjs +33 -6
- package/lib/template-submission.mjs +137 -0
- package/package.json +1 -1
|
@@ -481,6 +481,11 @@
|
|
|
481
481
|
"--foreground",
|
|
482
482
|
"--muted-foreground",
|
|
483
483
|
"--foreground-subtle",
|
|
484
|
+
"--inverse-foreground",
|
|
485
|
+
"--inverse-foreground-muted",
|
|
486
|
+
"--inverse-foreground-subtle",
|
|
487
|
+
"--inverse-hover",
|
|
488
|
+
"--inverse-focus-ring",
|
|
484
489
|
"--surface-hover",
|
|
485
490
|
"--radius-control",
|
|
486
491
|
"--space-2",
|
|
@@ -493,7 +498,8 @@
|
|
|
493
498
|
"useWhen": [
|
|
494
499
|
"A deep page needs parent-page context",
|
|
495
500
|
"Users need to understand where the current resource sits in a hierarchy",
|
|
496
|
-
"A long path may need collapsed middle items or an overflow menu"
|
|
501
|
+
"A long path may need collapsed middle items or an overflow menu",
|
|
502
|
+
"A top bar on --surface-inverse needs Ceramic-owned link, separator, current-page, hover, and focus colors"
|
|
497
503
|
],
|
|
498
504
|
"avoidWhen": [
|
|
499
505
|
"Primary navigation is needed; use Top Nav, Side Nav, or Navigation Menu",
|
|
@@ -508,6 +514,7 @@
|
|
|
508
514
|
"ai": {
|
|
509
515
|
"props": {
|
|
510
516
|
"aria-label": "Required localized label for the breadcrumb navigation landmark.",
|
|
517
|
+
"variant": "Use default for ordinary surfaces and inverse when the Breadcrumb is placed on --surface-inverse.",
|
|
511
518
|
"Breadcrumb": "Root nav landmark. Keep aria-label descriptive and localized when needed.",
|
|
512
519
|
"BreadcrumbList": "Ordered list wrapper for breadcrumb items and separators.",
|
|
513
520
|
"BreadcrumbItem": "List item wrapper for link, current page, or collapsed menu trigger.",
|
|
@@ -699,7 +706,10 @@
|
|
|
699
706
|
],
|
|
700
707
|
"ai": {
|
|
701
708
|
"props": {
|
|
702
|
-
"motion": "Optional boolean. Defaults to the MotionProvider policy and disables this component pattern when false."
|
|
709
|
+
"motion": "Optional boolean. Defaults to the MotionProvider policy and disables this component pattern when false.",
|
|
710
|
+
"contentAlign": "Use 'start' for leading-aligned labels, 'center' for the default action layout, or 'between' to pin endContent to the logical inline end.",
|
|
711
|
+
"startContent": "Optional leading icon or content slot with package-owned alignment.",
|
|
712
|
+
"endContent": "Optional trailing content slot. With contentAlign='between', it remains pinned while the label truncates."
|
|
703
713
|
}
|
|
704
714
|
}
|
|
705
715
|
},
|
|
@@ -2980,8 +2990,8 @@
|
|
|
2980
2990
|
"name": "Native Select",
|
|
2981
2991
|
"category": "Forms",
|
|
2982
2992
|
"status": "available",
|
|
2983
|
-
"packageImport": "import { NativeSelect, NativeSelectOptGroup, NativeSelectOption } from '@utopia-studio-design/design-system/
|
|
2984
|
-
"sourcePath": "packages/design-system/src/components/
|
|
2993
|
+
"packageImport": "import { NativeSelect, NativeSelectOptGroup, NativeSelectOption } from '@utopia-studio-design/design-system/Forms';",
|
|
2994
|
+
"sourcePath": "packages/design-system/src/components/Forms.tsx",
|
|
2985
2995
|
"shadcnFoundation": [
|
|
2986
2996
|
"native-select",
|
|
2987
2997
|
"shadcn/ui registry",
|
|
@@ -3008,10 +3018,12 @@
|
|
|
3008
3018
|
"avoidWhen": [
|
|
3009
3019
|
"Searchable or async option sets",
|
|
3010
3020
|
"Complex custom option rendering",
|
|
3021
|
+
"The opened option menu must match dark, light, or popover semantic tokens; use Select, SelectTrigger, SelectContent, and SelectItem",
|
|
3011
3022
|
"Product localization rules inside reusable component logic"
|
|
3012
3023
|
],
|
|
3013
3024
|
"neverInvent": [
|
|
3014
3025
|
"Product-owned option values or selection rules",
|
|
3026
|
+
"A promise that the opened native option menu can be fully themed; the OS or browser owns that surface",
|
|
3015
3027
|
"Production Arabic option labels not supplied by localization",
|
|
3016
3028
|
"Left/right-only layout rules",
|
|
3017
3029
|
"Utopia brand primitives inside reusable component logic"
|
|
@@ -3482,10 +3494,12 @@
|
|
|
3482
3494
|
"--background",
|
|
3483
3495
|
"--foreground",
|
|
3484
3496
|
"--muted-foreground",
|
|
3497
|
+
"--icon-size-sm",
|
|
3485
3498
|
"--button-height-sm"
|
|
3486
3499
|
],
|
|
3487
3500
|
"useWhen": [
|
|
3488
3501
|
"Compact option selection",
|
|
3502
|
+
"Dark, light, or branded surfaces where the opened menu must follow popover semantic tokens",
|
|
3489
3503
|
"Longer option sets than Radio Group",
|
|
3490
3504
|
"AI-generated forms that need explicit trigger, value, content, and item parts",
|
|
3491
3505
|
"Grouped option lists with labels",
|
|
@@ -3617,7 +3631,7 @@
|
|
|
3617
3631
|
"name": "Side Nav",
|
|
3618
3632
|
"category": "Navigation",
|
|
3619
3633
|
"status": "available",
|
|
3620
|
-
"packageImport": "import { PanelIcon, SideNav, SideNavCollapseButton, SideNavContent, SideNavHeading, SideNavItem, SideNavNestedGroup, SideNavNestedItems, SideNavSearch, SideNavSection } from '@utopia-studio-design/design-system/Navigation';",
|
|
3634
|
+
"packageImport": "import { NavigationIcon, PanelIcon, SideNav, SideNavAccount, SideNavAuxiliary, SideNavCollapseButton, SideNavCommand, SideNavContent, SideNavFooter, SideNavHeader, SideNavHeading, SideNavItem, SideNavMain, SideNavNestedGroup, SideNavNestedItems, SideNavSearch, SideNavSection, SideNavStatus, SideNavWorkspaceSwitcher } from '@utopia-studio-design/design-system/Navigation';",
|
|
3621
3635
|
"sourcePath": "packages/design-system/src/components/Navigation.tsx",
|
|
3622
3636
|
"shadcnFoundation": [
|
|
3623
3637
|
"sidebar",
|
|
@@ -3641,6 +3655,8 @@
|
|
|
3641
3655
|
"useWhen": [
|
|
3642
3656
|
"Persistent docs or app navigation",
|
|
3643
3657
|
"Grouped navigation links with current page state",
|
|
3658
|
+
"An application shell needs fixed header and footer regions with only the main navigation scrolling",
|
|
3659
|
+
"Search, AI commands, status, and account controls must adapt to expanded and collapsed states without app CSS overrides",
|
|
3644
3660
|
"A navigation surface needs package-owned content, search, section, nested group, item, heading, account, and collapse composition parts",
|
|
3645
3661
|
"A navigation surface should receive heading and search as SideNav props instead of hardcoding local wrappers",
|
|
3646
3662
|
"AI-generated app shells that need explicit section, heading, item, nested item, search, and collapse button parts"
|
|
@@ -3654,7 +3670,7 @@
|
|
|
3654
3670
|
"Raw shadcn theme colors",
|
|
3655
3671
|
"Left/right-only layout rules",
|
|
3656
3672
|
"Utopia brand primitives inside reusable component logic",
|
|
3657
|
-
"Local CSS-only search,
|
|
3673
|
+
"Local CSS-only search, command, account, footer, or content wrappers when the corresponding SideNav composition parts are available"
|
|
3658
3674
|
],
|
|
3659
3675
|
"ai": {
|
|
3660
3676
|
"props": {
|
|
@@ -3662,10 +3678,19 @@
|
|
|
3662
3678
|
"density": "Use default for app navigation; use compact for docs/library sidebars with dense catalog lists.",
|
|
3663
3679
|
"heading": "Optional SideNavHeading node rendered before search and navigation content.",
|
|
3664
3680
|
"search": "Optional SideNavSearch node rendered after heading and before navigation content.",
|
|
3665
|
-
"SideNavContent": "
|
|
3681
|
+
"SideNavContent": "Compatibility body region. Set layout='stack' for a flex column that supports an auto-positioned footer, or layout='grid' for the legacy grid flow.",
|
|
3682
|
+
"SideNavHeader": "Fixed header region for brand, workspace, and collapse controls.",
|
|
3683
|
+
"SideNavMain": "The only independently scrolling navigation region. It defaults to layout='stack' and fills remaining height.",
|
|
3684
|
+
"SideNavFooter": "Bottom-pinned, bounded footer region for status and account controls.",
|
|
3685
|
+
"SideNavCommand": "Full-width icon, label, and shortcut action. It derives collapsed state, accessible name, and tooltip title from SideNav context.",
|
|
3686
|
+
"SideNavAccount": "Stable avatar, single-line identity, and action layout. Use asChild or trigger to compose an app-owned popover/auth trigger.",
|
|
3687
|
+
"SideNavStatus": "Status indicator with label and optional description. Collapsed navigation retains the label for assistive technology and exposes a tooltip title.",
|
|
3688
|
+
"SideNavWorkspaceSwitcher": "Fixed region for an app-owned organization or workspace switcher.",
|
|
3689
|
+
"SideNavAuxiliary": "Fixed auxiliary action region outside the independently scrolling main navigation.",
|
|
3666
3690
|
"SideNavSearch": "Package-owned search field for filtering navigation lists without local input styling.",
|
|
3667
3691
|
"SideNavNestedGroup": "Groups a parent SideNavItem and its nested child collection.",
|
|
3668
3692
|
"SideNavNestedItems": "Indented child item collection using logical inline-start spacing and border.",
|
|
3693
|
+
"NavigationIcon": "Official Ceramic destination icon set. Use names such as dashboard, projects, tasks, inbox, files, analytics, team, settings, and help without importing an app icon package.",
|
|
3669
3694
|
"PanelIcon": "Direction-neutral icon exported for SideNavCollapseButton examples. Prefer it over directional arrows unless the directional icon has an RTL mirror rule."
|
|
3670
3695
|
},
|
|
3671
3696
|
"arabicFriendly": "Use logical start/end spacing in nested items and let document direction control order. Closed disclosure indicators rotate toward the inline start in LTR and RTL. Preserve scroll position when the side nav collapses and expands, and do not use left/right naming in generated side navigation layouts."
|
|
@@ -3823,6 +3848,7 @@
|
|
|
3823
3848
|
],
|
|
3824
3849
|
"ai": {
|
|
3825
3850
|
"props": {
|
|
3851
|
+
"asChild": "Use with a framework-native link such as Next.js Link so the link remains the single interactive element while SideNavItem supplies styling and state.",
|
|
3826
3852
|
"icon": "Optional leading visual slot. Omit for text-only rows; do not add placeholder marks.",
|
|
3827
3853
|
"depth": "Use 0 for root rows, 1 for items inside a top-level section, 2 for nested section children, and 3 only for rare deep navigation.",
|
|
3828
3854
|
"badge": "Optional trailing count or status pill aligned to the inline end.",
|
|
@@ -3930,6 +3956,8 @@
|
|
|
3930
3956
|
"--foreground",
|
|
3931
3957
|
"--border",
|
|
3932
3958
|
"--surface-hover",
|
|
3959
|
+
"--primary",
|
|
3960
|
+
"--font-size-supporting",
|
|
3933
3961
|
"--popover-surface",
|
|
3934
3962
|
"--radius-control",
|
|
3935
3963
|
"--radius-surface",
|
|
@@ -3979,6 +4007,11 @@
|
|
|
3979
4007
|
"SidebarTrigger",
|
|
3980
4008
|
"useSidebar"
|
|
3981
4009
|
],
|
|
4010
|
+
"props": {
|
|
4011
|
+
"SidebarMenuButton.activeVariant": "Use background for backward compatibility, indicator for a logical inline-start current marker, or both for the marker plus background.",
|
|
4012
|
+
"SidebarMenuButton.isActive": "Marks the item active and supplies aria-current=page unless the consumer provides another aria-current value.",
|
|
4013
|
+
"SidebarMenuButton.tooltip": "Provides collapsed hover/focus help and an accessible name when aria-label is omitted."
|
|
4014
|
+
},
|
|
3982
4015
|
"arabicFriendly": "Use dir=rtl at the shell boundary and provide localized collapseLabel, expandLabel, overlay labels, rail labels, and tooltip strings. Logical borders, alignment, off-canvas motion, submenus, and badges mirror without changing the component API."
|
|
3983
4016
|
}
|
|
3984
4017
|
},
|
|
@@ -4089,6 +4122,54 @@
|
|
|
4089
4122
|
"arabicFriendly": "Loading labels come from product localization. The spinner is direction-neutral and must not be mirrored."
|
|
4090
4123
|
}
|
|
4091
4124
|
},
|
|
4125
|
+
{
|
|
4126
|
+
"name": "Utopia Wordmark Loader",
|
|
4127
|
+
"category": "Data Display",
|
|
4128
|
+
"status": "available",
|
|
4129
|
+
"packageImport": "import { UtopiaWordmarkLoader } from '@utopia-studio-design/design-system/UtopiaWordmarkLoader';",
|
|
4130
|
+
"sourcePath": "packages/design-system/src/components/UtopiaWordmarkLoader.tsx",
|
|
4131
|
+
"shadcnFoundation": [
|
|
4132
|
+
"spinner status semantics",
|
|
4133
|
+
"full-screen loading state"
|
|
4134
|
+
],
|
|
4135
|
+
"fallbackToShadcn": "spinner",
|
|
4136
|
+
"requiredTokens": [
|
|
4137
|
+
"--brand-loader-background",
|
|
4138
|
+
"--brand-loader-accent",
|
|
4139
|
+
"--brand-loader-foreground",
|
|
4140
|
+
"--brand-loader-size",
|
|
4141
|
+
"--brand-loader-duration-enter",
|
|
4142
|
+
"--brand-loader-duration-cycle",
|
|
4143
|
+
"--brand-loader-duration-stagger",
|
|
4144
|
+
"--brand-loader-duration-exit",
|
|
4145
|
+
"--brand-loader-distance-exit"
|
|
4146
|
+
],
|
|
4147
|
+
"useWhen": [
|
|
4148
|
+
"A Utopia product needs a branded full-page or contained loading transition",
|
|
4149
|
+
"Workspace or route loading should end as soon as the consumer loading state resolves",
|
|
4150
|
+
"The Utopia Default theme is active and the stacked studio wordmark is appropriate"
|
|
4151
|
+
],
|
|
4152
|
+
"avoidWhen": [
|
|
4153
|
+
"Short inline pending states; use Spinner",
|
|
4154
|
+
"Layout-preserving content loading; use Skeleton",
|
|
4155
|
+
"A non-Utopia product theme needs its own brand mark"
|
|
4156
|
+
],
|
|
4157
|
+
"neverInvent": [
|
|
4158
|
+
"A timer that delays navigation after the real loading state resolves",
|
|
4159
|
+
"Left/right-only layout rules",
|
|
4160
|
+
"Utopia brand primitives outside this explicitly branded component contract"
|
|
4161
|
+
],
|
|
4162
|
+
"ai": {
|
|
4163
|
+
"props": {
|
|
4164
|
+
"label": "Required localized loading text announced through role=status.",
|
|
4165
|
+
"phase": "Use intro while loading and exit after the consumer loading state resolves.",
|
|
4166
|
+
"fullscreen": "Defaults to true. Set false for a contained loading region.",
|
|
4167
|
+
"size": "sm is the production default; md and lg are available for larger brand moments.",
|
|
4168
|
+
"onExitComplete": "Called after the exit motion so the consumer can unmount the overlay."
|
|
4169
|
+
},
|
|
4170
|
+
"arabicFriendly": "The mark is direction-neutral and must not mirror. The localized status label is visually hidden and remains consumer-owned."
|
|
4171
|
+
}
|
|
4172
|
+
},
|
|
4092
4173
|
{
|
|
4093
4174
|
"name": "Switch",
|
|
4094
4175
|
"category": "Forms",
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://utopia-studio.co/design-system/motion-profiles.schema.json",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"contract": {
|
|
5
|
+
"themeChooses": "motion personality and semantic recipes",
|
|
6
|
+
"applicationChooses": "runtime adapter",
|
|
7
|
+
"componentRequests": "feedback, page, surface, or layout",
|
|
8
|
+
"escapeHatch": "motion={false}",
|
|
9
|
+
"reducedMotion": "apply the semantic final state immediately without transform, filter, or temporal animation"
|
|
10
|
+
},
|
|
11
|
+
"adapters": [
|
|
12
|
+
{ "id": "waapi", "package": "built-in", "entry": "Motion" },
|
|
13
|
+
{ "id": "framer-motion", "package": "framer-motion", "entry": "MotionFramer" },
|
|
14
|
+
{ "id": "animejs", "package": "animejs", "entry": "MotionAnime" },
|
|
15
|
+
{ "id": "gsap", "package": "gsap", "entry": "MotionGsap" }
|
|
16
|
+
],
|
|
17
|
+
"profiles": [
|
|
18
|
+
{
|
|
19
|
+
"id": "ceremonial",
|
|
20
|
+
"label": "Ceremonial reveal",
|
|
21
|
+
"themes": ["utopia-default"],
|
|
22
|
+
"personality": "ceremonial",
|
|
23
|
+
"description": "A composed, high-fidelity reveal with restrained blur and long deceleration.",
|
|
24
|
+
"rules": ["Keep direct feedback fast", "Use blur only for page and large-surface reveals", "Make exits shorter than entrances"],
|
|
25
|
+
"timings": {
|
|
26
|
+
"press": { "duration": 0.16, "ease": [0.2, 0, 0, 1] },
|
|
27
|
+
"page": { "duration": 0.42, "ease": [0.16, 1, 0.3, 1] },
|
|
28
|
+
"expand": { "duration": 0.36, "ease": [0.16, 1, 0.3, 1] },
|
|
29
|
+
"reveal": { "duration": 0.44, "ease": [0.16, 1, 0.3, 1] },
|
|
30
|
+
"icon": { "duration": 0.64, "ease": [0.16, 1, 0.3, 1] }
|
|
31
|
+
},
|
|
32
|
+
"recipes": {
|
|
33
|
+
"feedback": {
|
|
34
|
+
"enter": { "from": { "scale": 1 }, "to": { "scale": 0.98 }, "timing": { "duration": 0.14, "ease": [0.2, 0, 0, 1] } },
|
|
35
|
+
"exit": { "from": { "scale": 0.98 }, "to": { "scale": 1 }, "timing": { "duration": 0.12, "ease": [0.2, 0, 0, 1] } }
|
|
36
|
+
},
|
|
37
|
+
"page": {
|
|
38
|
+
"enter": { "from": { "opacity": 0, "y": 6, "blur": 8 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.42, "ease": [0.16, 1, 0.3, 1] } },
|
|
39
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0, "y": -2, "blur": 4 }, "timing": { "duration": 0.24, "ease": [0.7, 0, 0.84, 0] } }
|
|
40
|
+
},
|
|
41
|
+
"surface": {
|
|
42
|
+
"enter": { "from": { "opacity": 0, "y": 8, "scale": 0.995, "blur": 8 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.44, "ease": [0.16, 1, 0.3, 1] } },
|
|
43
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0, "y": 2, "scale": 0.995, "blur": 4 }, "timing": { "duration": 0.26, "ease": [0.7, 0, 0.84, 0] } }
|
|
44
|
+
},
|
|
45
|
+
"layout": {
|
|
46
|
+
"enter": { "from": { "opacity": 0.88, "x": 8 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.36, "ease": [0.16, 1, 0.3, 1] } },
|
|
47
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0.88, "x": 4 }, "timing": { "duration": 0.22, "ease": [0.7, 0, 0.84, 0] } }
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"orchestration": { "delayChildren": 0.04, "stagger": 0.035 }
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "swift",
|
|
54
|
+
"label": "Swift response",
|
|
55
|
+
"themes": ["dextrum"],
|
|
56
|
+
"personality": "swift",
|
|
57
|
+
"description": "Fast, compact movement for dense technical workflows.",
|
|
58
|
+
"rules": ["No reveal blur", "No orchestration delay", "Prefer short directional shifts"],
|
|
59
|
+
"timings": {
|
|
60
|
+
"press": { "duration": 0.08, "ease": [0.2, 0, 0, 1] },
|
|
61
|
+
"page": { "duration": 0.14, "ease": [0.2, 0, 0, 1] },
|
|
62
|
+
"expand": { "duration": 0.16, "ease": [0.2, 0, 0, 1] },
|
|
63
|
+
"reveal": { "duration": 0.14, "ease": [0.2, 0, 0, 1] },
|
|
64
|
+
"icon": { "duration": 0.24, "ease": [0.2, 0, 0, 1] }
|
|
65
|
+
},
|
|
66
|
+
"recipes": {
|
|
67
|
+
"feedback": {
|
|
68
|
+
"enter": { "from": { "scale": 1 }, "to": { "scale": 0.97 }, "timing": { "duration": 0.08, "ease": [0.2, 0, 0, 1] } },
|
|
69
|
+
"exit": { "from": { "scale": 0.97 }, "to": { "scale": 1 }, "timing": { "duration": 0.07, "ease": [0.2, 0, 0, 1] } }
|
|
70
|
+
},
|
|
71
|
+
"page": {
|
|
72
|
+
"enter": { "from": { "opacity": 0, "x": 3 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.14, "ease": [0.2, 0, 0, 1] } },
|
|
73
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0, "x": -2 }, "timing": { "duration": 0.09, "ease": [0.7, 0, 0.84, 0] } }
|
|
74
|
+
},
|
|
75
|
+
"surface": {
|
|
76
|
+
"enter": { "from": { "opacity": 0, "y": 2 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.14, "ease": [0.2, 0, 0, 1] } },
|
|
77
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0 }, "timing": { "duration": 0.09, "ease": [0.7, 0, 0.84, 0] } }
|
|
78
|
+
},
|
|
79
|
+
"layout": {
|
|
80
|
+
"enter": { "from": { "opacity": 0.94, "x": 4 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.16, "ease": [0.2, 0, 0, 1] } },
|
|
81
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0.94, "x": 2 }, "timing": { "duration": 0.1, "ease": [0.7, 0, 0.84, 0] } }
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"orchestration": { "delayChildren": 0, "stagger": 0 }
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "precise",
|
|
88
|
+
"label": "Precise dissolve",
|
|
89
|
+
"themes": ["barrier-intelligence"],
|
|
90
|
+
"personality": "precise",
|
|
91
|
+
"description": "Controlled dissolves and small scale changes for analytical surfaces.",
|
|
92
|
+
"rules": ["Prefer opacity over travel", "Keep scale changes below two percent", "Preserve analytical continuity"],
|
|
93
|
+
"timings": {
|
|
94
|
+
"press": { "duration": 0.1, "ease": [0.2, 0, 0, 1] },
|
|
95
|
+
"page": { "duration": 0.2, "ease": [0.16, 1, 0.3, 1] },
|
|
96
|
+
"expand": { "duration": 0.22, "ease": [0.16, 1, 0.3, 1] },
|
|
97
|
+
"reveal": { "duration": 0.24, "ease": [0.16, 1, 0.3, 1] },
|
|
98
|
+
"icon": { "duration": 0.32, "ease": [0.16, 1, 0.3, 1] }
|
|
99
|
+
},
|
|
100
|
+
"recipes": {
|
|
101
|
+
"feedback": {
|
|
102
|
+
"enter": { "from": { "scale": 1 }, "to": { "scale": 0.985 }, "timing": { "duration": 0.1, "ease": [0.2, 0, 0, 1] } },
|
|
103
|
+
"exit": { "from": { "scale": 0.985 }, "to": { "scale": 1 }, "timing": { "duration": 0.08, "ease": [0.2, 0, 0, 1] } }
|
|
104
|
+
},
|
|
105
|
+
"page": {
|
|
106
|
+
"enter": { "from": { "opacity": 0 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.2, "ease": [0.16, 1, 0.3, 1] } },
|
|
107
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0 }, "timing": { "duration": 0.14, "ease": [0.7, 0, 0.84, 0] } }
|
|
108
|
+
},
|
|
109
|
+
"surface": {
|
|
110
|
+
"enter": { "from": { "opacity": 0, "scale": 0.99 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.24, "ease": [0.16, 1, 0.3, 1] } },
|
|
111
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0, "scale": 0.995 }, "timing": { "duration": 0.16, "ease": [0.7, 0, 0.84, 0] } }
|
|
112
|
+
},
|
|
113
|
+
"layout": {
|
|
114
|
+
"enter": { "from": { "opacity": 0.92, "x": 5 }, "to": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "timing": { "duration": 0.22, "ease": [0.16, 1, 0.3, 1] } },
|
|
115
|
+
"exit": { "from": { "opacity": 1, "x": 0, "y": 0, "scale": 1, "rotate": 0, "blur": 0 }, "to": { "opacity": 0.92, "x": 3 }, "timing": { "duration": 0.14, "ease": [0.7, 0, 0.84, 0] } }
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"orchestration": { "delayChildren": 0.02, "stagger": 0.02 }
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"packages/design-system/src/themes/barrier-intelligence.css",
|
|
10
10
|
"packages/design-system/src/manifests/theme-barrier-intelligence.json"
|
|
11
11
|
],
|
|
12
|
+
"motionProfile": "precise",
|
|
12
13
|
"brandPrimitives": {
|
|
13
14
|
"colors": {
|
|
14
15
|
"black": "#000000",
|
|
@@ -23,16 +24,22 @@
|
|
|
23
24
|
"goldDark": "#8A6637",
|
|
24
25
|
"gold": "#A6824C",
|
|
25
26
|
"goldLight": "#D2AC6C",
|
|
26
|
-
"goldForeground": "#1A1208"
|
|
27
|
+
"goldForeground": "#1A1208",
|
|
28
|
+
"detectorLime": "#A6B86A",
|
|
29
|
+
"assuranceAtRisk": "#C47C48",
|
|
30
|
+
"assuranceLost": "#C76B62",
|
|
31
|
+
"assuranceWarning": "#D2A65A"
|
|
27
32
|
},
|
|
28
33
|
"typography": {
|
|
29
34
|
"appWebsite": {
|
|
30
35
|
"ui": "Hanken Grotesk",
|
|
36
|
+
"mono": "JetBrains Mono",
|
|
31
37
|
"use": "Product UI, dashboards, documentation, and long-form reading"
|
|
32
38
|
},
|
|
33
39
|
"arabicFamily": "IBM Plex Sans Arabic",
|
|
34
40
|
"weights": {
|
|
35
|
-
"hankenGrotesk": [400, 500, 600, 700]
|
|
41
|
+
"hankenGrotesk": [400, 500, 600, 700],
|
|
42
|
+
"jetBrainsMono": [400, 500, 600]
|
|
36
43
|
},
|
|
37
44
|
"arabicWeights": [400, 500, 700],
|
|
38
45
|
"headlineCasing": "sentence",
|
|
@@ -66,7 +73,21 @@
|
|
|
66
73
|
"--font-sans": "Hanken Grotesk",
|
|
67
74
|
"--font-ui-support": "Hanken Grotesk",
|
|
68
75
|
"--font-marketing-display": "Hanken Grotesk scoped through theme selectors",
|
|
76
|
+
"--font-mono": "JetBrains Mono",
|
|
69
77
|
"--font-arabic": "IBM Plex Sans Arabic",
|
|
78
|
+
"--font-size-marketing-h1": "clamp(3rem, 6vw, 5.75rem)",
|
|
79
|
+
"--font-size-marketing-h2": "clamp(2.25rem, 4vw, 3.75rem)",
|
|
80
|
+
"--font-size-marketing-h3": "clamp(1.5rem, 2.5vw, 2.25rem)",
|
|
81
|
+
"--line-height-marketing-h1": "1",
|
|
82
|
+
"--line-height-marketing-h2": "1.06",
|
|
83
|
+
"--line-height-marketing-h3": "1.14",
|
|
84
|
+
"--measure-marketing-h1": "12ch",
|
|
85
|
+
"--measure-marketing-h2": "18ch",
|
|
86
|
+
"--measure-marketing-h3": "28ch",
|
|
87
|
+
"--container-standard": "72rem",
|
|
88
|
+
"--container-wide": "90rem",
|
|
89
|
+
"--page-gutter": "clamp(1rem, 3vw, 2.5rem)",
|
|
90
|
+
"--content-measure": "72ch",
|
|
70
91
|
"--sidebar-width": "17rem",
|
|
71
92
|
"--shadow-control": "none",
|
|
72
93
|
"--control-height-sm": "2rem",
|
|
@@ -77,6 +98,48 @@
|
|
|
77
98
|
"--modal-surface": "Card High",
|
|
78
99
|
"--popover-surface": "Card High"
|
|
79
100
|
},
|
|
101
|
+
"activationContract": {
|
|
102
|
+
"brandAttribute": "data-brand=\"barrier-intelligence\"",
|
|
103
|
+
"modeAttribute": "data-color-mode=\"dark|light|system\"",
|
|
104
|
+
"defaultMode": "dark",
|
|
105
|
+
"legacyAlias": "data-theme=\"barrier-intelligence\" remains supported during migration",
|
|
106
|
+
"rule": "Changing brand must not overwrite the persisted color mode. System follows prefers-color-scheme."
|
|
107
|
+
},
|
|
108
|
+
"layoutContract": {
|
|
109
|
+
"standard": "--container-standard",
|
|
110
|
+
"wide": "--container-wide",
|
|
111
|
+
"gutter": "--page-gutter",
|
|
112
|
+
"readingMeasure": "--content-measure",
|
|
113
|
+
"formula": "inline-size: min(calc(100% - 2 * var(--page-gutter)), var(--container-standard)); margin-inline: auto",
|
|
114
|
+
"rule": "Navigation, hero, and body content share the same responsive gutter. Products do not invent --page or --hero-page aliases."
|
|
115
|
+
},
|
|
116
|
+
"detectorStatus": {
|
|
117
|
+
"primitive": { "token": "--bi-detector-lime", "value": "#A6B86A" },
|
|
118
|
+
"semanticTokens": ["--detector-active", "--detector-active-foreground", "--detector-active-surface", "--detector-active-border"],
|
|
119
|
+
"use": ["active detectors", "verified detector output"],
|
|
120
|
+
"avoid": ["general calls to action", "decorative glow", "neon page accents"],
|
|
121
|
+
"accessibility": "Pair color with an icon and localized status label; verify text and control contrast in Dark and Light."
|
|
122
|
+
},
|
|
123
|
+
"assuranceStates": {
|
|
124
|
+
"credited": ["--assurance-credited", "--assurance-credited-foreground", "--assurance-credited-surface", "--assurance-credited-border"],
|
|
125
|
+
"atRisk": ["--assurance-at-risk", "--assurance-at-risk-foreground", "--assurance-at-risk-surface", "--assurance-at-risk-border"],
|
|
126
|
+
"lost": ["--assurance-lost", "--assurance-lost-foreground", "--assurance-lost-surface", "--assurance-lost-border"],
|
|
127
|
+
"warning": ["--assurance-warning", "--assurance-warning-foreground", "--assurance-warning-surface", "--assurance-warning-border"],
|
|
128
|
+
"verified": ["--assurance-verified", "--assurance-verified-foreground", "--assurance-verified-surface", "--assurance-verified-border"],
|
|
129
|
+
"rule": "Assurance states are domain semantics, not aliases for generic success/warning/destructive. Never communicate state by color alone."
|
|
130
|
+
},
|
|
131
|
+
"motionContract": {
|
|
132
|
+
"durations": ["--motion-duration-press", "--motion-duration-page", "--motion-duration-expand", "--motion-duration-reveal", "--motion-duration-icon"],
|
|
133
|
+
"easing": ["--motion-ease-standard", "--motion-ease-emphasized", "--motion-ease-icon"],
|
|
134
|
+
"distance": { "page": "6px", "reveal": "10px" },
|
|
135
|
+
"reducedMotion": "Core sets durations and distances to zero, disables icon animation, and restores press scale to 1 under prefers-reduced-motion."
|
|
136
|
+
},
|
|
137
|
+
"fontSupply": {
|
|
138
|
+
"hankenGrotesk": "Loaded by the theme stylesheet from Google Fonts",
|
|
139
|
+
"jetBrainsMono": "Loaded by the theme stylesheet from Google Fonts",
|
|
140
|
+
"ibmPlexSansArabic": "Self-hosted in the package with 400, 500, and 700 weights",
|
|
141
|
+
"display": "swap"
|
|
142
|
+
},
|
|
80
143
|
"visualPolicy": {
|
|
81
144
|
"tone": ["rigorous", "quiet", "technical", "premium"],
|
|
82
145
|
"allow": [
|
|
@@ -84,14 +147,16 @@
|
|
|
84
147
|
"warm gold accents for primary action and signal",
|
|
85
148
|
"neutral ink hierarchy for reading",
|
|
86
149
|
"rounded cards with hairline borders",
|
|
87
|
-
"minimal shadow; depth via border and surface steps"
|
|
150
|
+
"minimal shadow; depth via border and surface steps",
|
|
151
|
+
"restrained detector lime for active and verified engineering states"
|
|
88
152
|
],
|
|
89
153
|
"avoid": [
|
|
90
154
|
"bright neon accents",
|
|
91
155
|
"colorful gradients as a default surface treatment",
|
|
92
156
|
"overly rounded, playful geometry",
|
|
93
157
|
"Utopia brick red palette",
|
|
94
|
-
"marketing display fonts in dense app UI"
|
|
158
|
+
"marketing display fonts in dense app UI",
|
|
159
|
+
"detector lime used as a decorative or glowing accent"
|
|
95
160
|
]
|
|
96
161
|
},
|
|
97
162
|
"iconPolicy": {
|
|
@@ -101,6 +166,15 @@
|
|
|
101
166
|
"avoid": ["emoji", "mixed icon families in one surface"],
|
|
102
167
|
"coreNote": "Icon policy is theme-owned. Core components remain icon-system neutral."
|
|
103
168
|
},
|
|
169
|
+
"marketingAssetPolicy": {
|
|
170
|
+
"relationshipToIcons": "Lucide remains the UI icon system. Three-dimensional engineering assets are marketing media, not component icons.",
|
|
171
|
+
"palette": ["warm gold", "controlled grayscale", "restrained detector lime"],
|
|
172
|
+
"material": "Machined, technical, and restrained rather than glossy or toy-like.",
|
|
173
|
+
"lighting": "Directional studio lighting with clear form and no decorative neon glow.",
|
|
174
|
+
"background": "Near-black or controlled neutral fields with sufficient object separation.",
|
|
175
|
+
"use": ["engineering concepts", "detector visualization", "assurance evidence", "product capability storytelling"],
|
|
176
|
+
"avoid": ["generic abstract blobs", "glassmorphism", "cyberpunk glow", "decorative lime accents", "Lucide icons rendered as 3D objects"]
|
|
177
|
+
},
|
|
104
178
|
"translations": {
|
|
105
179
|
"ar": {
|
|
106
180
|
"summary": "ثيم Barrier Intelligence مربوط بعقد Ceramic الدلالي. يستخدم أسطح منتجات شبه سوداء ولمسات ذهبية دافئة وتسلسلا محايدا محسوبا. يقود Hanken Grotesk واجهة المنتج والتوثيق، وتبقى أي طباعة تسويقية محصورة في محددات يملكها الثيم.",
|
|
@@ -114,9 +188,14 @@
|
|
|
114
188
|
"aiRules": [
|
|
115
189
|
"Read this theme policy after the core semantic contract.",
|
|
116
190
|
"Map Barrier Intelligence palette through semantic tokens only.",
|
|
191
|
+
"Select the Barrier Intelligence brand with data-brand and select Dark, Light, or System independently with data-color-mode.",
|
|
192
|
+
"Use core container and gutter tokens instead of product-local --page or --hero-page aliases.",
|
|
117
193
|
"Use gold for primary actions and high-signal emphasis, not as a full-page wash.",
|
|
194
|
+
"Use detector lime only for active detectors and verified states, always with a non-color status cue.",
|
|
195
|
+
"Use assurance semantic token families for credited, at risk, lost, warning, and verified states.",
|
|
118
196
|
"Prefer near-black and stepped card surfaces with ink hierarchy.",
|
|
119
197
|
"Use Hanken Grotesk for Latin app UI and body copy in this theme.",
|
|
198
|
+
"Use the dedicated marketing H1, H2, and H3 size, line-height, and measure tokens instead of scaling --font-size-display ad hoc.",
|
|
120
199
|
"Keep Arabic on IBM Plex Sans Arabic tokens.",
|
|
121
200
|
"Do not swap Ceramic shell navigation branding when this theme is active."
|
|
122
201
|
]
|