@setsquare/ui 0.1.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.
Files changed (312) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +49 -0
  4. package/README.md +313 -0
  5. package/dist/index.d.ts +129 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +78 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/cn.d.ts +4 -0
  10. package/dist/lib/cn.d.ts.map +1 -0
  11. package/dist/lib/cn.js +59 -0
  12. package/dist/lib/cn.js.map +1 -0
  13. package/dist/lib/tokens.d.ts +5 -0
  14. package/dist/lib/tokens.d.ts.map +1 -0
  15. package/dist/lib/tokens.js +22 -0
  16. package/dist/lib/tokens.js.map +1 -0
  17. package/dist/lib/use-element-width.d.ts +4 -0
  18. package/dist/lib/use-element-width.d.ts.map +1 -0
  19. package/dist/lib/use-element-width.js +17 -0
  20. package/dist/lib/use-element-width.js.map +1 -0
  21. package/dist/lint/index.d.ts +41 -0
  22. package/dist/lint/index.d.ts.map +1 -0
  23. package/dist/lint/index.js +648 -0
  24. package/dist/lint/index.js.map +1 -0
  25. package/dist/shell/app-header.d.ts +13 -0
  26. package/dist/shell/app-header.d.ts.map +1 -0
  27. package/dist/shell/app-header.js +11 -0
  28. package/dist/shell/app-header.js.map +1 -0
  29. package/dist/shell/dashboard-shell.d.ts +67 -0
  30. package/dist/shell/dashboard-shell.d.ts.map +1 -0
  31. package/dist/shell/dashboard-shell.js +168 -0
  32. package/dist/shell/dashboard-shell.js.map +1 -0
  33. package/dist/shell/page-header.d.ts +19 -0
  34. package/dist/shell/page-header.d.ts.map +1 -0
  35. package/dist/shell/page-header.js +11 -0
  36. package/dist/shell/page-header.js.map +1 -0
  37. package/dist/shell/right-panel.d.ts +25 -0
  38. package/dist/shell/right-panel.d.ts.map +1 -0
  39. package/dist/shell/right-panel.js +37 -0
  40. package/dist/shell/right-panel.js.map +1 -0
  41. package/dist/shell/sidebar.d.ts +68 -0
  42. package/dist/shell/sidebar.d.ts.map +1 -0
  43. package/dist/shell/sidebar.js +68 -0
  44. package/dist/shell/sidebar.js.map +1 -0
  45. package/dist/shell/site-footer.d.ts +28 -0
  46. package/dist/shell/site-footer.d.ts.map +1 -0
  47. package/dist/shell/site-footer.js +15 -0
  48. package/dist/shell/site-footer.js.map +1 -0
  49. package/dist/shell/site-header-padding.d.ts +7 -0
  50. package/dist/shell/site-header-padding.d.ts.map +1 -0
  51. package/dist/shell/site-header-padding.js +27 -0
  52. package/dist/shell/site-header-padding.js.map +1 -0
  53. package/dist/shell/site-header.d.ts +23 -0
  54. package/dist/shell/site-header.d.ts.map +1 -0
  55. package/dist/shell/site-header.js +13 -0
  56. package/dist/shell/site-header.js.map +1 -0
  57. package/dist/shell/site-menu.d.ts +27 -0
  58. package/dist/shell/site-menu.d.ts.map +1 -0
  59. package/dist/shell/site-menu.js +56 -0
  60. package/dist/shell/site-menu.js.map +1 -0
  61. package/dist/shell/site-nav-link.d.ts +24 -0
  62. package/dist/shell/site-nav-link.d.ts.map +1 -0
  63. package/dist/shell/site-nav-link.js +35 -0
  64. package/dist/shell/site-nav-link.js.map +1 -0
  65. package/dist/shell/site-nav.d.ts +12 -0
  66. package/dist/shell/site-nav.d.ts.map +1 -0
  67. package/dist/shell/site-nav.js +9 -0
  68. package/dist/shell/site-nav.js.map +1 -0
  69. package/dist/shell/site-path.d.ts +8 -0
  70. package/dist/shell/site-path.d.ts.map +1 -0
  71. package/dist/shell/site-path.js +11 -0
  72. package/dist/shell/site-path.js.map +1 -0
  73. package/dist/shell/site-shell.d.ts +25 -0
  74. package/dist/shell/site-shell.d.ts.map +1 -0
  75. package/dist/shell/site-shell.js +17 -0
  76. package/dist/shell/site-shell.js.map +1 -0
  77. package/dist/styles/styles.css +10 -0
  78. package/dist/styles/theme.css +579 -0
  79. package/dist/styles/tokens.css +295 -0
  80. package/dist/testing/index.d.ts +321 -0
  81. package/dist/testing/index.d.ts.map +1 -0
  82. package/dist/testing/index.js +1175 -0
  83. package/dist/testing/index.js.map +1 -0
  84. package/dist/tokens.json +982 -0
  85. package/dist/ui/alert.d.ts +35 -0
  86. package/dist/ui/alert.d.ts.map +1 -0
  87. package/dist/ui/alert.js +65 -0
  88. package/dist/ui/alert.js.map +1 -0
  89. package/dist/ui/avatar.d.ts +16 -0
  90. package/dist/ui/avatar.d.ts.map +1 -0
  91. package/dist/ui/avatar.js +13 -0
  92. package/dist/ui/avatar.js.map +1 -0
  93. package/dist/ui/badge.d.ts +13 -0
  94. package/dist/ui/badge.d.ts.map +1 -0
  95. package/dist/ui/badge.js +24 -0
  96. package/dist/ui/badge.js.map +1 -0
  97. package/dist/ui/breadcrumbs.d.ts +13 -0
  98. package/dist/ui/breadcrumbs.d.ts.map +1 -0
  99. package/dist/ui/breadcrumbs.js +12 -0
  100. package/dist/ui/breadcrumbs.js.map +1 -0
  101. package/dist/ui/button-styles.d.ts +24 -0
  102. package/dist/ui/button-styles.d.ts.map +1 -0
  103. package/dist/ui/button-styles.js +50 -0
  104. package/dist/ui/button-styles.js.map +1 -0
  105. package/dist/ui/button.d.ts +27 -0
  106. package/dist/ui/button.d.ts.map +1 -0
  107. package/dist/ui/button.js +30 -0
  108. package/dist/ui/button.js.map +1 -0
  109. package/dist/ui/calendar.d.ts +19 -0
  110. package/dist/ui/calendar.d.ts.map +1 -0
  111. package/dist/ui/calendar.js +52 -0
  112. package/dist/ui/calendar.js.map +1 -0
  113. package/dist/ui/card.d.ts +30 -0
  114. package/dist/ui/card.d.ts.map +1 -0
  115. package/dist/ui/card.js +18 -0
  116. package/dist/ui/card.js.map +1 -0
  117. package/dist/ui/checkbox.d.ts +36 -0
  118. package/dist/ui/checkbox.d.ts.map +1 -0
  119. package/dist/ui/checkbox.js +38 -0
  120. package/dist/ui/checkbox.js.map +1 -0
  121. package/dist/ui/code-block.d.ts +20 -0
  122. package/dist/ui/code-block.d.ts.map +1 -0
  123. package/dist/ui/code-block.js +22 -0
  124. package/dist/ui/code-block.js.map +1 -0
  125. package/dist/ui/combo-box.d.ts +17 -0
  126. package/dist/ui/combo-box.d.ts.map +1 -0
  127. package/dist/ui/combo-box.js +14 -0
  128. package/dist/ui/combo-box.js.map +1 -0
  129. package/dist/ui/copy-button.d.ts +14 -0
  130. package/dist/ui/copy-button.d.ts.map +1 -0
  131. package/dist/ui/copy-button.js +36 -0
  132. package/dist/ui/copy-button.js.map +1 -0
  133. package/dist/ui/date-field.d.ts +38 -0
  134. package/dist/ui/date-field.d.ts.map +1 -0
  135. package/dist/ui/date-field.js +78 -0
  136. package/dist/ui/date-field.js.map +1 -0
  137. package/dist/ui/dialog.d.ts +41 -0
  138. package/dist/ui/dialog.d.ts.map +1 -0
  139. package/dist/ui/dialog.js +69 -0
  140. package/dist/ui/dialog.js.map +1 -0
  141. package/dist/ui/disclosure.d.ts +18 -0
  142. package/dist/ui/disclosure.d.ts.map +1 -0
  143. package/dist/ui/disclosure.js +15 -0
  144. package/dist/ui/disclosure.js.map +1 -0
  145. package/dist/ui/empty-state.d.ts +17 -0
  146. package/dist/ui/empty-state.d.ts.map +1 -0
  147. package/dist/ui/empty-state.js +9 -0
  148. package/dist/ui/empty-state.js.map +1 -0
  149. package/dist/ui/error-state.d.ts +45 -0
  150. package/dist/ui/error-state.d.ts.map +1 -0
  151. package/dist/ui/error-state.js +88 -0
  152. package/dist/ui/error-state.js.map +1 -0
  153. package/dist/ui/field.d.ts +46 -0
  154. package/dist/ui/field.d.ts.map +1 -0
  155. package/dist/ui/field.js +79 -0
  156. package/dist/ui/field.js.map +1 -0
  157. package/dist/ui/file-upload.d.ts +54 -0
  158. package/dist/ui/file-upload.d.ts.map +1 -0
  159. package/dist/ui/file-upload.js +170 -0
  160. package/dist/ui/file-upload.js.map +1 -0
  161. package/dist/ui/form.d.ts +56 -0
  162. package/dist/ui/form.d.ts.map +1 -0
  163. package/dist/ui/form.js +137 -0
  164. package/dist/ui/form.js.map +1 -0
  165. package/dist/ui/grid-list.d.ts +24 -0
  166. package/dist/ui/grid-list.d.ts.map +1 -0
  167. package/dist/ui/grid-list.js +21 -0
  168. package/dist/ui/grid-list.js.map +1 -0
  169. package/dist/ui/hero.d.ts +36 -0
  170. package/dist/ui/hero.d.ts.map +1 -0
  171. package/dist/ui/hero.js +19 -0
  172. package/dist/ui/hero.js.map +1 -0
  173. package/dist/ui/icon-button.d.ts +18 -0
  174. package/dist/ui/icon-button.d.ts.map +1 -0
  175. package/dist/ui/icon-button.js +13 -0
  176. package/dist/ui/icon-button.js.map +1 -0
  177. package/dist/ui/icon.d.ts +20 -0
  178. package/dist/ui/icon.d.ts.map +1 -0
  179. package/dist/ui/icon.js +26 -0
  180. package/dist/ui/icon.js.map +1 -0
  181. package/dist/ui/kbd.d.ts +7 -0
  182. package/dist/ui/kbd.d.ts.map +1 -0
  183. package/dist/ui/kbd.js +7 -0
  184. package/dist/ui/kbd.js.map +1 -0
  185. package/dist/ui/link-card.d.ts +23 -0
  186. package/dist/ui/link-card.d.ts.map +1 -0
  187. package/dist/ui/link-card.js +19 -0
  188. package/dist/ui/link-card.js.map +1 -0
  189. package/dist/ui/list-box.d.ts +17 -0
  190. package/dist/ui/list-box.d.ts.map +1 -0
  191. package/dist/ui/list-box.js +18 -0
  192. package/dist/ui/list-box.js.map +1 -0
  193. package/dist/ui/menu.d.ts +31 -0
  194. package/dist/ui/menu.d.ts.map +1 -0
  195. package/dist/ui/menu.js +40 -0
  196. package/dist/ui/menu.js.map +1 -0
  197. package/dist/ui/number-field.d.ts +19 -0
  198. package/dist/ui/number-field.d.ts.map +1 -0
  199. package/dist/ui/number-field.js +19 -0
  200. package/dist/ui/number-field.js.map +1 -0
  201. package/dist/ui/prose.d.ts +12 -0
  202. package/dist/ui/prose.d.ts.map +1 -0
  203. package/dist/ui/prose.js +11 -0
  204. package/dist/ui/prose.js.map +1 -0
  205. package/dist/ui/radio-group.d.ts +20 -0
  206. package/dist/ui/radio-group.d.ts.map +1 -0
  207. package/dist/ui/radio-group.js +16 -0
  208. package/dist/ui/radio-group.js.map +1 -0
  209. package/dist/ui/scroll-region.d.ts +18 -0
  210. package/dist/ui/scroll-region.d.ts.map +1 -0
  211. package/dist/ui/scroll-region.js +29 -0
  212. package/dist/ui/scroll-region.js.map +1 -0
  213. package/dist/ui/search-field.d.ts +12 -0
  214. package/dist/ui/search-field.d.ts.map +1 -0
  215. package/dist/ui/search-field.js +12 -0
  216. package/dist/ui/search-field.js.map +1 -0
  217. package/dist/ui/search.d.ts +43 -0
  218. package/dist/ui/search.d.ts.map +1 -0
  219. package/dist/ui/search.js +45 -0
  220. package/dist/ui/search.js.map +1 -0
  221. package/dist/ui/section.d.ts +50 -0
  222. package/dist/ui/section.d.ts.map +1 -0
  223. package/dist/ui/section.js +25 -0
  224. package/dist/ui/section.js.map +1 -0
  225. package/dist/ui/segmented-control.d.ts +18 -0
  226. package/dist/ui/segmented-control.d.ts.map +1 -0
  227. package/dist/ui/segmented-control.js +17 -0
  228. package/dist/ui/segmented-control.js.map +1 -0
  229. package/dist/ui/select.d.ts +18 -0
  230. package/dist/ui/select.d.ts.map +1 -0
  231. package/dist/ui/select.js +13 -0
  232. package/dist/ui/select.js.map +1 -0
  233. package/dist/ui/selection-bar.d.ts +28 -0
  234. package/dist/ui/selection-bar.d.ts.map +1 -0
  235. package/dist/ui/selection-bar.js +35 -0
  236. package/dist/ui/selection-bar.js.map +1 -0
  237. package/dist/ui/sheet.d.ts +21 -0
  238. package/dist/ui/sheet.d.ts.map +1 -0
  239. package/dist/ui/sheet.js +16 -0
  240. package/dist/ui/sheet.js.map +1 -0
  241. package/dist/ui/skeleton.d.ts +31 -0
  242. package/dist/ui/skeleton.d.ts.map +1 -0
  243. package/dist/ui/skeleton.js +38 -0
  244. package/dist/ui/skeleton.js.map +1 -0
  245. package/dist/ui/slider.d.ts +31 -0
  246. package/dist/ui/slider.d.ts.map +1 -0
  247. package/dist/ui/slider.js +33 -0
  248. package/dist/ui/slider.js.map +1 -0
  249. package/dist/ui/spinner.d.ts +27 -0
  250. package/dist/ui/spinner.d.ts.map +1 -0
  251. package/dist/ui/spinner.js +21 -0
  252. package/dist/ui/spinner.js.map +1 -0
  253. package/dist/ui/split.d.ts +14 -0
  254. package/dist/ui/split.d.ts.map +1 -0
  255. package/dist/ui/split.js +11 -0
  256. package/dist/ui/split.js.map +1 -0
  257. package/dist/ui/stat-list.d.ts +25 -0
  258. package/dist/ui/stat-list.d.ts.map +1 -0
  259. package/dist/ui/stat-list.js +14 -0
  260. package/dist/ui/stat-list.js.map +1 -0
  261. package/dist/ui/steps.d.ts +23 -0
  262. package/dist/ui/steps.d.ts.map +1 -0
  263. package/dist/ui/steps.js +16 -0
  264. package/dist/ui/steps.js.map +1 -0
  265. package/dist/ui/switch.d.ts +13 -0
  266. package/dist/ui/switch.d.ts.map +1 -0
  267. package/dist/ui/switch.js +12 -0
  268. package/dist/ui/switch.js.map +1 -0
  269. package/dist/ui/table.d.ts +25 -0
  270. package/dist/ui/table.d.ts.map +1 -0
  271. package/dist/ui/table.js +29 -0
  272. package/dist/ui/table.js.map +1 -0
  273. package/dist/ui/tag.d.ts +14 -0
  274. package/dist/ui/tag.d.ts.map +1 -0
  275. package/dist/ui/tag.js +11 -0
  276. package/dist/ui/tag.js.map +1 -0
  277. package/dist/ui/text-field.d.ts +27 -0
  278. package/dist/ui/text-field.d.ts.map +1 -0
  279. package/dist/ui/text-field.js +17 -0
  280. package/dist/ui/text-field.js.map +1 -0
  281. package/dist/ui/text-link.d.ts +17 -0
  282. package/dist/ui/text-link.d.ts.map +1 -0
  283. package/dist/ui/text-link.js +15 -0
  284. package/dist/ui/text-link.js.map +1 -0
  285. package/dist/ui/theme-switcher.d.ts +26 -0
  286. package/dist/ui/theme-switcher.d.ts.map +1 -0
  287. package/dist/ui/theme-switcher.js +32 -0
  288. package/dist/ui/theme-switcher.js.map +1 -0
  289. package/dist/ui/theme.d.ts +54 -0
  290. package/dist/ui/theme.d.ts.map +1 -0
  291. package/dist/ui/theme.js +135 -0
  292. package/dist/ui/theme.js.map +1 -0
  293. package/dist/ui/toast.d.ts +34 -0
  294. package/dist/ui/toast.d.ts.map +1 -0
  295. package/dist/ui/toast.js +69 -0
  296. package/dist/ui/toast.js.map +1 -0
  297. package/dist/ui/tooltip.d.ts +10 -0
  298. package/dist/ui/tooltip.d.ts.map +1 -0
  299. package/dist/ui/tooltip.js +10 -0
  300. package/dist/ui/tooltip.js.map +1 -0
  301. package/package.json +123 -0
  302. package/templates/next/error.tsx +32 -0
  303. package/templates/next/loading.tsx +19 -0
  304. package/templates/next/not-found.tsx +18 -0
  305. package/templates/next/page-transition.tsx +33 -0
  306. package/templates/next/portal-layout.tsx +70 -0
  307. package/templates/next/prefetch-on-intent.ts +31 -0
  308. package/templates/next/root-layout.tsx +16 -0
  309. package/templates/next/site-layout.tsx +58 -0
  310. package/templates/next/site-nav.ts +16 -0
  311. package/templates/next/site-not-found.tsx +21 -0
  312. package/templates/next/site-router.tsx +17 -0
@@ -0,0 +1,982 @@
1
+ {
2
+ "name": "Setsquare UI",
3
+ "version": 1,
4
+ "color": {
5
+ "themes": [
6
+ {
7
+ "id": "light",
8
+ "name": "Light · AA"
9
+ },
10
+ {
11
+ "id": "dark",
12
+ "name": "Dark · AA"
13
+ },
14
+ {
15
+ "id": "light-aaa",
16
+ "name": "Light · AAA"
17
+ },
18
+ {
19
+ "id": "dark-aaa",
20
+ "name": "Dark · AAA"
21
+ }
22
+ ],
23
+ "tokens": [
24
+ {
25
+ "name": "brand",
26
+ "value": {
27
+ "light": "#2f47c9",
28
+ "dark": "#8fa3ff",
29
+ "light-aaa": "#22369f",
30
+ "dark-aaa": "#b0beff"
31
+ },
32
+ "usage": "Placeholder product hue — Docuccino and Setsquare each override it. Primary actions, current-page marker, links, focus ring. As text: on background, card, sidebar and brand-subtle."
33
+ },
34
+ {
35
+ "name": "brand-subtle",
36
+ "value": {
37
+ "light": "#eceffc",
38
+ "dark": "#1b2246",
39
+ "light-aaa": "#e6eafb",
40
+ "dark-aaa": "#1a2148"
41
+ },
42
+ "usage": "Tinted ground behind brand text: the current nav item, selected table rows, info notices."
43
+ },
44
+ {
45
+ "name": "background",
46
+ "value": {
47
+ "light": "#ffffff",
48
+ "dark": "#0e1116",
49
+ "light-aaa": "#ffffff",
50
+ "dark-aaa": "#07090c"
51
+ },
52
+ "usage": "Page ground and the main content region."
53
+ },
54
+ {
55
+ "name": "foreground",
56
+ "value": {
57
+ "light": "#161a1f",
58
+ "dark": "#e7eaee",
59
+ "light-aaa": "#0c0e11",
60
+ "dark-aaa": "#f5f7f9"
61
+ },
62
+ "usage": "Primary text and icons, on every surface token (background, card, popover, muted, secondary, accent, sidebar, sidebar-accent, brand-subtle)."
63
+ },
64
+ {
65
+ "name": "card",
66
+ "value": {
67
+ "light": "#ffffff",
68
+ "dark": "#151a21",
69
+ "light-aaa": "#ffffff",
70
+ "dark-aaa": "#0e1217"
71
+ },
72
+ "usage": "Cards, the right panel and table containers."
73
+ },
74
+ {
75
+ "name": "card-foreground",
76
+ "value": {
77
+ "light": "{foreground}",
78
+ "dark": "{foreground}",
79
+ "light-aaa": "{foreground}",
80
+ "dark-aaa": "{foreground}"
81
+ },
82
+ "usage": "Text on card (alias of foreground)."
83
+ },
84
+ {
85
+ "name": "popover",
86
+ "value": {
87
+ "light": "#ffffff",
88
+ "dark": "#1a2029",
89
+ "light-aaa": "#ffffff",
90
+ "dark-aaa": "#12171e"
91
+ },
92
+ "usage": "Menus, the search results listbox, popovers, dialogs."
93
+ },
94
+ {
95
+ "name": "popover-foreground",
96
+ "value": {
97
+ "light": "{foreground}",
98
+ "dark": "{foreground}",
99
+ "light-aaa": "{foreground}",
100
+ "dark-aaa": "{foreground}"
101
+ },
102
+ "usage": "Text on popover (alias of foreground)."
103
+ },
104
+ {
105
+ "name": "muted",
106
+ "value": {
107
+ "light": "#f2f4f6",
108
+ "dark": "#1b212a",
109
+ "light-aaa": "#f1f3f5",
110
+ "dark-aaa": "#151a21"
111
+ },
112
+ "usage": "Quiet fills: table header row, search field rest state, skeletons."
113
+ },
114
+ {
115
+ "name": "muted-foreground",
116
+ "value": {
117
+ "light": "#59626d",
118
+ "dark": "#9ba5b1",
119
+ "light-aaa": "#3c444e",
120
+ "dark-aaa": "#c5ccd4"
121
+ },
122
+ "usage": "Secondary text — metadata, helper text, placeholders, section labels — on background, card, muted, popover and sidebar."
123
+ },
124
+ {
125
+ "name": "secondary",
126
+ "value": {
127
+ "light": "#eceff3",
128
+ "dark": "#202731",
129
+ "light-aaa": "#e9ecf0",
130
+ "dark-aaa": "#1a2029"
131
+ },
132
+ "usage": "Secondary button fill."
133
+ },
134
+ {
135
+ "name": "secondary-foreground",
136
+ "value": {
137
+ "light": "{foreground}",
138
+ "dark": "{foreground}",
139
+ "light-aaa": "{foreground}",
140
+ "dark-aaa": "{foreground}"
141
+ },
142
+ "usage": "Text on secondary (alias of foreground)."
143
+ },
144
+ {
145
+ "name": "accent",
146
+ "value": {
147
+ "light": "#e7ebf0",
148
+ "dark": "#232b36",
149
+ "light-aaa": "#e3e7ec",
150
+ "dark-aaa": "#1f2630"
151
+ },
152
+ "usage": "Hover and pressed fill for ghost buttons, menu items and table rows. Not a brand colour: shadcn's name for the hover ground."
153
+ },
154
+ {
155
+ "name": "accent-foreground",
156
+ "value": {
157
+ "light": "{foreground}",
158
+ "dark": "{foreground}",
159
+ "light-aaa": "{foreground}",
160
+ "dark-aaa": "{foreground}"
161
+ },
162
+ "usage": "Text on accent (alias of foreground)."
163
+ },
164
+ {
165
+ "name": "primary",
166
+ "value": {
167
+ "light": "{brand}",
168
+ "dark": "{brand}",
169
+ "light-aaa": "{brand}",
170
+ "dark-aaa": "{brand}"
171
+ },
172
+ "usage": "Primary button fill — one per view, for the thing the page is for. Alias of brand."
173
+ },
174
+ {
175
+ "name": "primary-foreground",
176
+ "value": {
177
+ "light": "#ffffff",
178
+ "dark": "#0e1116",
179
+ "light-aaa": "#ffffff",
180
+ "dark-aaa": "#07090c"
181
+ },
182
+ "usage": "Label and icon on a primary fill."
183
+ },
184
+ {
185
+ "name": "border",
186
+ "value": {
187
+ "light": "#e0e4e9",
188
+ "dark": "#28303a",
189
+ "light-aaa": "#7f8792",
190
+ "dark-aaa": "#6c7580"
191
+ },
192
+ "usage": "Dividers and card edges. Decorative in AA (no contrast floor); in AAA themes it meets 3:1 so regions read by edge, not by shade."
193
+ },
194
+ {
195
+ "name": "input",
196
+ "value": {
197
+ "light": "#7a838e",
198
+ "dark": "#6b7582",
199
+ "light-aaa": "#5d6570",
200
+ "dark-aaa": "#8c96a3"
201
+ },
202
+ "usage": "Boundary of every form control (search, inputs, selects, checkboxes). At least 3:1 on background, card, muted and sidebar (WCAG 1.4.11). 4.5:1 in the AAA themes is a house rule: WCAG sets no enhanced level for 1.4.11."
203
+ },
204
+ {
205
+ "name": "ring",
206
+ "value": {
207
+ "light": "{brand}",
208
+ "dark": "{brand}",
209
+ "light-aaa": "{brand}",
210
+ "dark-aaa": "{brand}"
211
+ },
212
+ "usage": "Focus indicator colour, drawn as an outline of focus-width at focus-offset. At least 3:1 on every surface it lands on. Alias of brand — re-check if a product changes brand."
213
+ },
214
+ {
215
+ "name": "destructive",
216
+ "value": {
217
+ "light": "#bf2a2a",
218
+ "dark": "#f47a70",
219
+ "light-aaa": "#8c1818",
220
+ "dark-aaa": "#ffa39b"
221
+ },
222
+ "usage": "Destructive button fill and error text/icons, on background, card and destructive-subtle."
223
+ },
224
+ {
225
+ "name": "destructive-foreground",
226
+ "value": {
227
+ "light": "#ffffff",
228
+ "dark": "#0e1116",
229
+ "light-aaa": "#ffffff",
230
+ "dark-aaa": "#07090c"
231
+ },
232
+ "usage": "Label on a destructive fill."
233
+ },
234
+ {
235
+ "name": "destructive-subtle",
236
+ "value": {
237
+ "light": "#fdecec",
238
+ "dark": "#3a1616",
239
+ "light-aaa": "#fbe7e7",
240
+ "dark-aaa": "#3a1313"
241
+ },
242
+ "usage": "Ground behind error text: inline alerts, error badges."
243
+ },
244
+ {
245
+ "name": "success",
246
+ "value": {
247
+ "light": "#0a6f61",
248
+ "dark": "#4fd3b8",
249
+ "light-aaa": "#06544a",
250
+ "dark-aaa": "#86e6d0"
251
+ },
252
+ "usage": "Success text and icons (a blue-leaning teal so it never relies on red/green hue alone), on background, card and success-subtle."
253
+ },
254
+ {
255
+ "name": "success-subtle",
256
+ "value": {
257
+ "light": "#e2f4f0",
258
+ "dark": "#0f2c27",
259
+ "light-aaa": "#ddf1ec",
260
+ "dark-aaa": "#0d2a25"
261
+ },
262
+ "usage": "Ground behind success text."
263
+ },
264
+ {
265
+ "name": "warning",
266
+ "value": {
267
+ "light": "#8a4f00",
268
+ "dark": "#f0b45c",
269
+ "light-aaa": "#663a00",
270
+ "dark-aaa": "#f8cd8c"
271
+ },
272
+ "usage": "Warning text and icons, on background, card and warning-subtle."
273
+ },
274
+ {
275
+ "name": "warning-subtle",
276
+ "value": {
277
+ "light": "#fdf0da",
278
+ "dark": "#2f230f",
279
+ "light-aaa": "#fcecd2",
280
+ "dark-aaa": "#2c200c"
281
+ },
282
+ "usage": "Ground behind warning text."
283
+ },
284
+ {
285
+ "name": "overlay",
286
+ "value": {
287
+ "light": "#0c0e1166",
288
+ "dark": "#000000a6",
289
+ "light-aaa": "#0c0e1180",
290
+ "dark-aaa": "#000000b3"
291
+ },
292
+ "usage": "Scrim behind Sheets and the search dialog. Dims the page in every theme; never used for text."
293
+ },
294
+ {
295
+ "name": "sidebar",
296
+ "value": {
297
+ "light": "#f6f7f9",
298
+ "dark": "#11151b",
299
+ "light-aaa": "#f4f6f8",
300
+ "dark-aaa": "#0b0e12"
301
+ },
302
+ "usage": "Sidebar ground and the canvas around the inset surface."
303
+ },
304
+ {
305
+ "name": "sidebar-foreground",
306
+ "value": {
307
+ "light": "{foreground}",
308
+ "dark": "{foreground}",
309
+ "light-aaa": "{foreground}",
310
+ "dark-aaa": "{foreground}"
311
+ },
312
+ "usage": "Nav labels and icons on sidebar and sidebar-accent."
313
+ },
314
+ {
315
+ "name": "sidebar-primary",
316
+ "value": {
317
+ "light": "{brand}",
318
+ "dark": "{brand}",
319
+ "light-aaa": "{brand}",
320
+ "dark-aaa": "{brand}"
321
+ },
322
+ "usage": "Current-page marker bar and the workspace avatar fill."
323
+ },
324
+ {
325
+ "name": "sidebar-primary-foreground",
326
+ "value": {
327
+ "light": "{primary-foreground}",
328
+ "dark": "{primary-foreground}",
329
+ "light-aaa": "{primary-foreground}",
330
+ "dark-aaa": "{primary-foreground}"
331
+ },
332
+ "usage": "Text on sidebar-primary."
333
+ },
334
+ {
335
+ "name": "sidebar-accent",
336
+ "value": {
337
+ "light": "#e8ebf0",
338
+ "dark": "#1f2630",
339
+ "light-aaa": "#e3e7ec",
340
+ "dark-aaa": "#1b222b"
341
+ },
342
+ "usage": "Hover fill for nav items."
343
+ },
344
+ {
345
+ "name": "sidebar-accent-foreground",
346
+ "value": {
347
+ "light": "{foreground}",
348
+ "dark": "{foreground}",
349
+ "light-aaa": "{foreground}",
350
+ "dark-aaa": "{foreground}"
351
+ },
352
+ "usage": "Text on sidebar-accent."
353
+ },
354
+ {
355
+ "name": "sidebar-border",
356
+ "value": {
357
+ "light": "{border}",
358
+ "dark": "{border}",
359
+ "light-aaa": "{border}",
360
+ "dark-aaa": "{border}"
361
+ },
362
+ "usage": "Sidebar edge and section dividers."
363
+ },
364
+ {
365
+ "name": "sidebar-ring",
366
+ "value": {
367
+ "light": "{ring}",
368
+ "dark": "{ring}",
369
+ "light-aaa": "{ring}",
370
+ "dark-aaa": "{ring}"
371
+ },
372
+ "usage": "Focus ring inside the sidebar."
373
+ }
374
+ ]
375
+ },
376
+ "type": {
377
+ "fonts": [],
378
+ "families": {
379
+ "sans": "\"Atkinson Hyperlegible Next\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif",
380
+ "mono": "\"Atkinson Hyperlegible Mono\", ui-monospace, \"SF Mono\", Menlo, monospace"
381
+ },
382
+ "groups": [
383
+ {
384
+ "name": "Interface",
385
+ "family": "sans",
386
+ "note": "Atkinson Hyperlegible Next from Google Fonts (next/font/google in code). One family, weights 400–700.",
387
+ "styles": [
388
+ {
389
+ "name": "text-title",
390
+ "fontSize": "24px",
391
+ "lineHeight": "32px",
392
+ "fontWeight": 700,
393
+ "letterSpacing": "-0.01em",
394
+ "sample": "Projects",
395
+ "usage": "The page h1, once per page."
396
+ },
397
+ {
398
+ "name": "text-heading",
399
+ "fontSize": "18px",
400
+ "lineHeight": "28px",
401
+ "fontWeight": 600,
402
+ "sample": "Customer portal",
403
+ "usage": "h2: card and panel titles, section headings."
404
+ },
405
+ {
406
+ "name": "text-subheading",
407
+ "fontSize": "16px",
408
+ "lineHeight": "24px",
409
+ "fontWeight": 600,
410
+ "sample": "Recent activity",
411
+ "usage": "h3 inside cards and the right panel."
412
+ },
413
+ {
414
+ "name": "text-body",
415
+ "fontSize": "15px",
416
+ "lineHeight": "24px",
417
+ "fontWeight": 400,
418
+ "sample": "Changes you make here apply to everyone in the workspace.",
419
+ "usage": "Prose: descriptions, help text, empty states. Line height 1.6 meets the line-spacing part of 1.4.8; set on measure."
420
+ },
421
+ {
422
+ "name": "text-ui",
423
+ "fontSize": "14px",
424
+ "lineHeight": "20px",
425
+ "fontWeight": 400,
426
+ "sample": "Updated 2 hours ago",
427
+ "usage": "Interface text: table cells, nav labels, inputs."
428
+ },
429
+ {
430
+ "name": "text-ui-strong",
431
+ "fontSize": "14px",
432
+ "lineHeight": "20px",
433
+ "fontWeight": 600,
434
+ "sample": "New project",
435
+ "usage": "Button labels, the current nav item (700), table links."
436
+ },
437
+ {
438
+ "name": "text-caption",
439
+ "fontSize": "13px",
440
+ "lineHeight": "20px",
441
+ "fontWeight": 400,
442
+ "sample": "Owner · Priya Shah",
443
+ "usage": "Metadata and timestamps in muted-foreground. The smallest text size in the system."
444
+ },
445
+ {
446
+ "name": "text-caption-strong",
447
+ "fontSize": "13px",
448
+ "lineHeight": "20px",
449
+ "fontWeight": 600,
450
+ "sample": "Workspace",
451
+ "usage": "Sidebar section labels, table headers, badges. Sentence case, never uppercase."
452
+ }
453
+ ]
454
+ },
455
+ {
456
+ "name": "Display",
457
+ "family": "sans",
458
+ "styles": [
459
+ {
460
+ "name": "text-display",
461
+ "fontSize": "64px",
462
+ "lineHeight": 1.05,
463
+ "fontWeight": 700,
464
+ "letterSpacing": "-0.02em",
465
+ "fluid": {
466
+ "min": "36px",
467
+ "max": "64px"
468
+ },
469
+ "sample": "API docs that know their history",
470
+ "usage": "The h1 of a public page's hero, once per page. Fluid from 36px at 320px to 64px at 1280px; fontSize is the largest."
471
+ },
472
+ {
473
+ "name": "text-display-page",
474
+ "fontSize": "48px",
475
+ "lineHeight": 1.1,
476
+ "fontWeight": 700,
477
+ "letterSpacing": "-0.015em",
478
+ "fluid": {
479
+ "min": "32px",
480
+ "max": "48px"
481
+ },
482
+ "sample": "Privacy notice",
483
+ "usage": "The h1 of a public page led by prose: a legal page, a guide. Fluid from 32px to 48px."
484
+ },
485
+ {
486
+ "name": "text-display-section",
487
+ "fontSize": "36px",
488
+ "lineHeight": 1.15,
489
+ "fontWeight": 700,
490
+ "letterSpacing": "-0.01em",
491
+ "fluid": {
492
+ "min": "24px",
493
+ "max": "36px"
494
+ },
495
+ "sample": "How it works",
496
+ "usage": "A section's h2 on a public page. Fluid from 24px to 36px. Dashboards keep text-title and text-heading."
497
+ },
498
+ {
499
+ "name": "text-lead",
500
+ "fontSize": "20px",
501
+ "lineHeight": 1.5,
502
+ "fontWeight": 400,
503
+ "fluid": {
504
+ "min": "17px",
505
+ "max": "20px"
506
+ },
507
+ "sample": "Your application in, a document that knows its own history out.",
508
+ "usage": "The intro paragraph under a display heading, inside --measure. Fluid from 17px to 20px, with 1.5 line spacing."
509
+ }
510
+ ]
511
+ },
512
+ {
513
+ "name": "Code",
514
+ "family": "mono",
515
+ "styles": [
516
+ {
517
+ "name": "text-code",
518
+ "fontSize": "13px",
519
+ "lineHeight": "20px",
520
+ "fontWeight": 400,
521
+ "sample": "prj_7f3a21",
522
+ "usage": "IDs, keys, keyboard hints and code."
523
+ }
524
+ ]
525
+ }
526
+ ]
527
+ },
528
+ "spacing": {
529
+ "note": "4px grid. Spacing that a conformance level governs lives in Conformance, not here.",
530
+ "tokens": [
531
+ {
532
+ "name": "space-1",
533
+ "value": "4px",
534
+ "usage": "Icon-to-label gap inside badges."
535
+ },
536
+ {
537
+ "name": "space-2",
538
+ "value": "8px",
539
+ "usage": "Icon-to-label gap in buttons and nav rows; tight stacks."
540
+ },
541
+ {
542
+ "name": "space-3",
543
+ "value": "12px",
544
+ "usage": "Nav row padding; gap between related fields."
545
+ },
546
+ {
547
+ "name": "space-4",
548
+ "value": "16px",
549
+ "usage": "Header padding; card padding; panel section padding."
550
+ },
551
+ {
552
+ "name": "space-5",
553
+ "value": "20px",
554
+ "usage": "Gap between a heading and the content it introduces."
555
+ },
556
+ {
557
+ "name": "space-6",
558
+ "value": "24px",
559
+ "usage": "Page gutter; gap between cards."
560
+ },
561
+ {
562
+ "name": "space-8",
563
+ "value": "32px",
564
+ "usage": "Between page sections."
565
+ },
566
+ {
567
+ "name": "space-10",
568
+ "value": "40px",
569
+ "usage": "Empty-state padding."
570
+ },
571
+ {
572
+ "name": "space-12",
573
+ "value": "48px",
574
+ "usage": "Top of long-form pages."
575
+ },
576
+ {
577
+ "name": "space-16",
578
+ "value": "64px",
579
+ "usage": "Large empty states and onboarding."
580
+ }
581
+ ]
582
+ },
583
+ "radius": {
584
+ "note": "Soft corners that step up with the size of the surface.",
585
+ "tokens": [
586
+ {
587
+ "name": "radius-sm",
588
+ "value": "4px",
589
+ "usage": "Keyboard hints, table-cell tags, cut tiles."
590
+ },
591
+ {
592
+ "name": "radius-md",
593
+ "value": "6px",
594
+ "usage": "Buttons, inputs, nav rows."
595
+ },
596
+ {
597
+ "name": "radius-lg",
598
+ "value": "8px",
599
+ "usage": "Cards, the right panel, popovers."
600
+ },
601
+ {
602
+ "name": "radius-xl",
603
+ "value": "12px",
604
+ "usage": "The inset content surface and the search dialog."
605
+ },
606
+ {
607
+ "name": "radius-full",
608
+ "value": "9999px",
609
+ "usage": "Badges, avatars, the notification count."
610
+ }
611
+ ]
612
+ },
613
+ "shadow": {
614
+ "note": "Floating things only. AAA themes drop resting shadows and rely on 3:1 borders.",
615
+ "tokens": [
616
+ {
617
+ "name": "shadow-sm",
618
+ "value": {
619
+ "light": "0 1px 2px #161a1f0f, 0 1px 3px #161a1f14",
620
+ "dark": "0 1px 3px #000000a6",
621
+ "light-aaa": "none",
622
+ "dark-aaa": "none"
623
+ },
624
+ "usage": "The inset content surface and raised cards. None in AAA themes: borders do the separating."
625
+ },
626
+ {
627
+ "name": "shadow-lg",
628
+ "value": {
629
+ "light": "0 4px 8px #161a1f14, 0 16px 32px -4px #161a1f29",
630
+ "dark": "0 16px 32px -4px #000000cc",
631
+ "light-aaa": "0 4px 8px #0c0e1129, 0 16px 32px -4px #0c0e1140",
632
+ "dark-aaa": "0 16px 32px -4px #000000e6"
633
+ },
634
+ "usage": "Anything floating: menus, search results, sheets. Always paired with a border."
635
+ }
636
+ ]
637
+ },
638
+ "conformance": {
639
+ "note": "Every value a WCAG level governs, as an -aa / -aaa pair, set by data-conformance on <html>. Controls have three layers: the target (Layer 1, transparent, at least --target-min), the painted box (Layer 2) and the content (Layer 3). The level changes targets, gaps and focus. Paint is the same size at both levels by default, so AAA looks like AA; for bigger paint at AAA, raise the -aaa value.",
640
+ "tokens": [
641
+ {
642
+ "name": "target-min-aa",
643
+ "value": "24px",
644
+ "usage": "Layer 1: the WCAG 2.5.8 floor for every pointer target (resolved as --target-min). The interactive element itself is at least this in both axes; the painted box inside it can be smaller."
645
+ },
646
+ {
647
+ "name": "target-min-aaa",
648
+ "value": "44px",
649
+ "usage": "Layer 1 at AAA: WCAG 2.5.5 Target Size (Enhanced). Resolved as --target-min when data-conformance=\"aaa\"."
650
+ },
651
+ {
652
+ "name": "target-floor",
653
+ "value": "24px",
654
+ "usage": "The 2.5.8 minimum, at every level. Only for a target that 2.5.5's Equivalent exception covers at AAA: calendar days on a screen too narrow for seven 44px days, where the typed date field beside them is the 44px equivalent."
655
+ },
656
+ {
657
+ "name": "control-height-aa",
658
+ "value": "36px",
659
+ "usage": "Layer 2: the painted height of buttons, inputs, selects, the header search and segments (resolved as --control-height). The target around it is max(--target-min, --control-height)."
660
+ },
661
+ {
662
+ "name": "control-height-aaa",
663
+ "value": "36px",
664
+ "usage": "Equal to AA by default: at AAA the same 36px box sits in a 44px target."
665
+ },
666
+ {
667
+ "name": "control-height-sm-aa",
668
+ "value": "28px",
669
+ "usage": "Layer 2 for dense icon buttons: table row actions, panel close, calendar paging (resolved as --control-height-sm)."
670
+ },
671
+ {
672
+ "name": "control-height-sm-aaa",
673
+ "value": "28px",
674
+ "usage": "Equal to AA by default: at AAA the 28px box sits in a 44px target."
675
+ },
676
+ {
677
+ "name": "control-height-lg-aa",
678
+ "value": "44px",
679
+ "usage": "Layer 2 for large buttons: a page's call to action on a marketing page (resolved as --control-height-lg). The same at AA and AAA, like the other painted sizes."
680
+ },
681
+ {
682
+ "name": "control-height-lg-aaa",
683
+ "value": "44px",
684
+ "usage": "The painted height of a large button at AAA. Raise it to paint large buttons bigger at AAA."
685
+ },
686
+ {
687
+ "name": "control-pad-x-aa",
688
+ "value": "12px",
689
+ "usage": "Horizontal padding inside the painted box of buttons and inputs (resolved as --control-pad-x)."
690
+ },
691
+ {
692
+ "name": "control-pad-x-aaa",
693
+ "value": "12px",
694
+ "usage": "Equal to AA: the painted box is the same size, so it keeps the same padding."
695
+ },
696
+ {
697
+ "name": "control-gap-aa",
698
+ "value": "8px",
699
+ "usage": "Gap between adjacent controls in a toolbar or button group (resolved as --control-gap)."
700
+ },
701
+ {
702
+ "name": "control-gap-aaa",
703
+ "value": "12px",
704
+ "usage": "Larger gap at AAA to cut accidental activation of a neighbour."
705
+ },
706
+ {
707
+ "name": "nav-item-height-aa",
708
+ "value": "36px",
709
+ "usage": "Layer 2: the painted row in the sidebar, menus and lists (resolved as --nav-item-height). The row's target is at least --target-min."
710
+ },
711
+ {
712
+ "name": "nav-item-height-aaa",
713
+ "value": "36px",
714
+ "usage": "Equal to AA by default: at AAA the 36px highlight sits in a 44px row."
715
+ },
716
+ {
717
+ "name": "nav-item-gap-aa",
718
+ "value": "2px",
719
+ "usage": "Vertical gap between nav rows (resolved as --nav-item-gap)."
720
+ },
721
+ {
722
+ "name": "nav-item-gap-aaa",
723
+ "value": "4px",
724
+ "usage": "Clearer separation between stacked targets at AAA."
725
+ },
726
+ {
727
+ "name": "choice-size-aa",
728
+ "value": "20px",
729
+ "usage": "Checkbox, radio, switch-thumb and slider-thumb indicator (resolved as --choice-size). The whole labelled row is the target, at least --target-min tall."
730
+ },
731
+ {
732
+ "name": "choice-size-aaa",
733
+ "value": "20px",
734
+ "usage": "Equal to AA by default; the row around it grows to the 44px target."
735
+ },
736
+ {
737
+ "name": "field-gap-aa",
738
+ "value": "20px",
739
+ "usage": "Vertical space between fields in a form (resolved as --field-gap)."
740
+ },
741
+ {
742
+ "name": "field-gap-aaa",
743
+ "value": "28px",
744
+ "usage": "More room between fields at AAA so each label clearly belongs to one control."
745
+ },
746
+ {
747
+ "name": "toast-timeout-aa",
748
+ "value": "8000ms",
749
+ "usage": "How long a routine toast stays (resolved as --toast-timeout); paused while hovered or focused. Toasts with an action, and errors, never time out (WCAG 2.2.1)."
750
+ },
751
+ {
752
+ "name": "toast-timeout-aaa",
753
+ "value": "0ms",
754
+ "usage": "0 = toasts stay until dismissed (WCAG 2.2.3 No Timing)."
755
+ },
756
+ {
757
+ "name": "focus-width-aa",
758
+ "value": "2px",
759
+ "usage": "Focus outline thickness (resolved as --focus-width): meets 2.4.7 and already the 2px perimeter 2.4.13 asks for."
760
+ },
761
+ {
762
+ "name": "focus-width-aaa",
763
+ "value": "3px",
764
+ "usage": "Thicker outline at AAA, comfortably inside 2.4.13 Focus Appearance."
765
+ },
766
+ {
767
+ "name": "focus-offset",
768
+ "value": "2px",
769
+ "usage": "Gap between a control and its focus outline, so the ring sits on the surrounding surface — which is why ring is checked against every surface."
770
+ },
771
+ {
772
+ "name": "paragraph-gap-aa",
773
+ "value": "1em",
774
+ "usage": "Space after a paragraph in prose (resolved as --paragraph-gap)."
775
+ },
776
+ {
777
+ "name": "paragraph-gap-aaa",
778
+ "value": "1.5lh",
779
+ "usage": "WCAG 1.4.8: paragraph spacing at least 1.5× the line spacing."
780
+ },
781
+ {
782
+ "name": "measure-aa",
783
+ "value": "75ch",
784
+ "usage": "Max line length for prose: help text, descriptions, empty states (resolved as --measure)."
785
+ },
786
+ {
787
+ "name": "measure-aaa",
788
+ "value": "64ch",
789
+ "usage": "WCAG 1.4.8 caps lines at 80 characters; 64ch leaves margin because ch is the width of a zero, wider than average text."
790
+ },
791
+ {
792
+ "name": "motion-distance-aa",
793
+ "value": "8px",
794
+ "usage": "How far view-transition content travels (resolved as --motion-distance). Always 0 under prefers-reduced-motion."
795
+ },
796
+ {
797
+ "name": "motion-distance-aaa",
798
+ "value": "0px",
799
+ "usage": "WCAG 2.3.3: at AAA transitions fade only — opacity is not motion — so no interaction moves content."
800
+ }
801
+ ]
802
+ },
803
+ "layout": {
804
+ "note": "Shell dimensions, paired where they follow target size, plus breakpoints (use in Tailwind config; CSS variables cannot drive media queries).",
805
+ "tokens": [
806
+ {
807
+ "name": "header-height-aa",
808
+ "value": "56px",
809
+ "usage": "Top bar height (resolved as --header-height); also the scroll-padding-top that keeps focus clear of the sticky header (2.4.11)."
810
+ },
811
+ {
812
+ "name": "header-height-aaa",
813
+ "value": "56px",
814
+ "usage": "Equal to AA: the 44px targets fit the 56px bar, and the painted controls are the same size."
815
+ },
816
+ {
817
+ "name": "sidebar-width-aa",
818
+ "value": "256px",
819
+ "usage": "Expanded sidebar (resolved as --sidebar-width)."
820
+ },
821
+ {
822
+ "name": "sidebar-width-aaa",
823
+ "value": "256px",
824
+ "usage": "Equal to AA: rows paint at the same size; only their targets grow."
825
+ },
826
+ {
827
+ "name": "sidebar-width-collapsed-aa",
828
+ "value": "56px",
829
+ "usage": "Icon-only sidebar (resolved as --sidebar-width-collapsed): one target plus padding."
830
+ },
831
+ {
832
+ "name": "sidebar-width-collapsed-aaa",
833
+ "value": "72px",
834
+ "usage": "Collapsed width that fits a 44px target plus padding."
835
+ },
836
+ {
837
+ "name": "rail-width-aa",
838
+ "value": "72px",
839
+ "usage": "Labelled icon rail (resolved as --rail-width) — kept from layout option C for products that outgrow one nav list."
840
+ },
841
+ {
842
+ "name": "rail-width-aaa",
843
+ "value": "88px",
844
+ "usage": "Rail at AAA: 44px icon target plus its label."
845
+ },
846
+ {
847
+ "name": "subnav-width-aa",
848
+ "value": "224px",
849
+ "usage": "Contextual sub-navigation beside a rail (resolved as --subnav-width) — kept from layout option C."
850
+ },
851
+ {
852
+ "name": "subnav-width-aaa",
853
+ "value": "240px",
854
+ "usage": "Sub-navigation at AAA."
855
+ },
856
+ {
857
+ "name": "panel-width-aa",
858
+ "value": "320px",
859
+ "usage": "Right panel inside the content area (resolved as --panel-width)."
860
+ },
861
+ {
862
+ "name": "panel-width-aaa",
863
+ "value": "360px",
864
+ "usage": "Right panel at AAA."
865
+ },
866
+ {
867
+ "name": "gutter",
868
+ "value": "24px",
869
+ "usage": "Page padding around main content and the panel's inner padding at wide sizes."
870
+ },
871
+ {
872
+ "name": "content-max",
873
+ "value": "1440px",
874
+ "usage": "Max width of the main column's content before it centres."
875
+ },
876
+ {
877
+ "name": "site-max",
878
+ "value": "1180px",
879
+ "usage": "Width of a public page's content: the site container holds it and centres it, with site-gutter either side. A product may re-point it (docuccino.app's is 1280px)."
880
+ },
881
+ {
882
+ "name": "site-max-narrow",
883
+ "value": "768px",
884
+ "usage": "Width of narrow bands on a public page: a centred call to action, a heading on its own."
885
+ },
886
+ {
887
+ "name": "site-gutter",
888
+ "value": "clamp(20px, calc(3.2 * var(--site-vw, 1vw)), 44px)",
889
+ "usage": "Space either side of a public page's content: 20px on a phone, growing to 44px on a wide screen. Spacing, not text, so the zoom rule for fluid type doesn't bind it."
890
+ },
891
+ {
892
+ "name": "section-y",
893
+ "value": "clamp(56px, calc(7 * var(--site-vw, 1vw)), 112px)",
894
+ "usage": "Space above and below a section of a public page, fluid from 56px to 112px."
895
+ },
896
+ {
897
+ "name": "section-y-tight",
898
+ "value": "clamp(40px, calc(5 * var(--site-vw, 1vw)), 80px)",
899
+ "usage": "Space above and below a section in a dense run of sections, fluid from 40px to 80px."
900
+ },
901
+ {
902
+ "name": "bp-md",
903
+ "value": "768px",
904
+ "usage": "Below this (phones, and 400% zoom) the sidebar becomes a Sheet opened from the header, search becomes an icon button and the inset goes edge to edge."
905
+ },
906
+ {
907
+ "name": "bp-lg",
908
+ "value": "1024px",
909
+ "usage": "Below this the right panel opens as a Sheet instead of a column."
910
+ },
911
+ {
912
+ "name": "bp-xl",
913
+ "value": "1280px",
914
+ "usage": "Below this the sidebar starts collapsed to icons (a person can still expand it)."
915
+ }
916
+ ]
917
+ },
918
+ "duration": {
919
+ "note": "Durations and easing. Distance is motion-distance in Conformance.",
920
+ "tokens": [
921
+ {
922
+ "name": "duration-fast",
923
+ "value": "120ms",
924
+ "usage": "Hover and pressed colour changes."
925
+ },
926
+ {
927
+ "name": "duration-exit",
928
+ "value": "150ms",
929
+ "usage": "Outgoing view-transition snapshot: leave quickly."
930
+ },
931
+ {
932
+ "name": "duration-enter",
933
+ "value": "210ms",
934
+ "usage": "Incoming view-transition snapshot, delayed by duration-exit."
935
+ },
936
+ {
937
+ "name": "duration-panel",
938
+ "value": "200ms",
939
+ "usage": "Sheets opening, and the sidebar collapsing (no width animation at AAA or with reduced motion)."
940
+ },
941
+ {
942
+ "name": "duration-loading-delay",
943
+ "value": "400ms",
944
+ "usage": "Wait before showing a spinner or skeleton, so fast responses never flash one."
945
+ },
946
+ {
947
+ "name": "duration-spin",
948
+ "value": "900ms",
949
+ "usage": "One turn of the spinner. At AAA and under reduced motion it pulses instead of turning."
950
+ },
951
+ {
952
+ "name": "ease-standard",
953
+ "value": "cubic-bezier(0.2, 0, 0, 1)",
954
+ "usage": "Default easing for every transition."
955
+ }
956
+ ]
957
+ },
958
+ "zIndex": {
959
+ "tokens": [
960
+ {
961
+ "name": "z-header",
962
+ "value": "30",
963
+ "usage": "Sticky header."
964
+ },
965
+ {
966
+ "name": "z-sidebar",
967
+ "value": "40",
968
+ "usage": "Sidebar when it overlays content below bp-md."
969
+ },
970
+ {
971
+ "name": "z-sheet",
972
+ "value": "50",
973
+ "usage": "Sheets and dialogs (right panel below bp-xl)."
974
+ },
975
+ {
976
+ "name": "z-popover",
977
+ "value": "60",
978
+ "usage": "Menus, search results, tooltips."
979
+ }
980
+ ]
981
+ }
982
+ }