@surflane/ui 0.9.0 → 0.10.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 (291) hide show
  1. package/README.md +4 -4
  2. package/dist/accordion.d.ts +33 -17
  3. package/dist/accordion.js +10 -11
  4. package/dist/alert-dialog.d.ts +8 -4
  5. package/dist/alert-dialog.js +3 -4
  6. package/dist/app-shell.d.ts +81 -44
  7. package/dist/app-shell.js +67 -29
  8. package/dist/autocomplete.d.ts +117 -61
  9. package/dist/autocomplete.js +8 -8
  10. package/dist/avatar.d.ts +34 -17
  11. package/dist/avatar.js +8 -9
  12. package/dist/badge.d.ts +6 -10
  13. package/dist/badge.js +5 -6
  14. package/dist/bottom-navigation.d.ts +11 -41
  15. package/dist/bottom-navigation.js +9 -10
  16. package/dist/breadcrumbs.d.ts +21 -5
  17. package/dist/breadcrumbs.js +12 -14
  18. package/dist/button.d.ts +15 -8
  19. package/dist/button.js +8 -9
  20. package/dist/card.d.ts +610 -35
  21. package/dist/card.js +12 -12
  22. package/dist/chart.d.ts +9 -32
  23. package/dist/chart.js +65 -26
  24. package/dist/checkbox-group.d.ts +4 -1
  25. package/dist/checkbox-group.js +3 -4
  26. package/dist/checkbox.d.ts +13 -4
  27. package/dist/checkbox.js +6 -6
  28. package/dist/choice-label.d.ts +3 -11
  29. package/dist/choice-label.js +4 -4
  30. package/dist/class-names.d.ts +6 -0
  31. package/dist/class-names.js +18 -0
  32. package/dist/code.d.ts +13 -10
  33. package/dist/code.js +8 -5
  34. package/dist/collapsible.d.ts +25 -12
  35. package/dist/collapsible.js +7 -8
  36. package/dist/combobox.d.ts +145 -73
  37. package/dist/combobox.js +27 -27
  38. package/dist/context-menu.d.ts +106 -54
  39. package/dist/context-menu.js +4 -5
  40. package/dist/css/accordion.css +1 -1
  41. package/dist/css/alert-dialog.css +2 -2
  42. package/dist/css/all.css +7 -5
  43. package/dist/css/app-shell.css +1 -1
  44. package/dist/css/autocomplete.css +1 -1
  45. package/dist/css/avatar.css +2 -2
  46. package/dist/css/badge.css +2 -2
  47. package/dist/css/bottom-navigation.css +1 -1
  48. package/dist/css/breadcrumbs.css +3 -3
  49. package/dist/css/button.css +1 -1
  50. package/dist/css/card.css +3 -3
  51. package/dist/css/chart.css +2 -2
  52. package/dist/css/checkbox-group.css +1 -1
  53. package/dist/css/checkbox.css +1 -1
  54. package/dist/css/choice-label.css +1 -1
  55. package/dist/css/code.css +2 -2
  56. package/dist/css/collapsible.css +1 -1
  57. package/dist/css/combobox.css +1 -1
  58. package/dist/css/context-menu.css +1 -1
  59. package/dist/css/date-picker.css +1 -1
  60. package/dist/css/dialog.css +2 -2
  61. package/dist/css/drawer.css +2 -2
  62. package/dist/css/empty-state.css +2 -2
  63. package/dist/css/field.css +1 -1
  64. package/dist/css/fieldset.css +1 -1
  65. package/dist/css/file-upload.css +2 -2
  66. package/dist/css/filter-bar.css +1 -1
  67. package/dist/css/form.css +1 -1
  68. package/dist/css/icon.css +1 -1
  69. package/dist/css/inline-message.css +2 -2
  70. package/dist/css/input.css +1 -1
  71. package/dist/css/layout.css +2 -2
  72. package/dist/css/link.css +2 -2
  73. package/dist/css/list.css +2 -2
  74. package/dist/css/markdown.css +4 -4
  75. package/dist/css/menu.css +1 -1
  76. package/dist/css/menubar.css +1 -1
  77. package/dist/css/meter.css +1 -1
  78. package/dist/css/native-select.css +1 -1
  79. package/dist/css/navigation-menu.css +1 -1
  80. package/dist/css/number-field.css +1 -1
  81. package/dist/css/otp-field.css +1 -1
  82. package/dist/css/page-header.css +3 -3
  83. package/dist/css/pagination.css +2 -2
  84. package/dist/css/popover.css +1 -1
  85. package/dist/css/preview-card.css +2 -2
  86. package/dist/css/progress.css +1 -1
  87. package/dist/css/radio-group.css +1 -1
  88. package/dist/css/rules/accordion.css +5 -5
  89. package/dist/css/rules/alert-dialog.css +9 -9
  90. package/dist/css/rules/app-shell.css +274 -82
  91. package/dist/css/rules/avatar.css +7 -7
  92. package/dist/css/rules/badge.css +6 -6
  93. package/dist/css/rules/bar.css +11 -11
  94. package/dist/css/rules/base.css +30 -30
  95. package/dist/css/rules/bottom-navigation.css +57 -56
  96. package/dist/css/rules/breadcrumbs.css +2 -2
  97. package/dist/css/rules/button.css +66 -65
  98. package/dist/css/rules/card.css +3 -3
  99. package/dist/css/rules/chart.css +134 -124
  100. package/dist/css/rules/checkbox.css +5 -5
  101. package/dist/css/rules/choice-label.css +19 -18
  102. package/dist/css/rules/choice.css +65 -60
  103. package/dist/css/rules/code.css +2 -2
  104. package/dist/css/rules/collapsible.css +2 -2
  105. package/dist/css/rules/combobox.css +87 -83
  106. package/dist/css/rules/context-menu.css +1 -1
  107. package/dist/css/rules/date-picker.css +150 -144
  108. package/dist/css/rules/dialog.css +85 -79
  109. package/dist/css/rules/disclosure.css +49 -47
  110. package/dist/css/rules/drawer.css +6 -6
  111. package/dist/css/rules/empty-state.css +2 -2
  112. package/dist/css/rules/field-control.css +51 -42
  113. package/dist/css/rules/field.css +26 -24
  114. package/dist/css/rules/fieldset.css +8 -8
  115. package/dist/css/rules/file-upload.css +73 -72
  116. package/dist/css/rules/filter-bar.css +19 -18
  117. package/dist/css/rules/form.css +3 -3
  118. package/dist/css/rules/gauge.css +22 -22
  119. package/dist/css/rules/icon.css +16 -11
  120. package/dist/css/rules/inline-message.css +3 -3
  121. package/dist/css/rules/input-group.css +44 -43
  122. package/dist/css/rules/input.css +11 -11
  123. package/dist/css/rules/item.css +7 -7
  124. package/dist/css/rules/link.css +2 -2
  125. package/dist/css/rules/list.css +3 -3
  126. package/dist/css/rules/markdown.css +27 -27
  127. package/dist/css/rules/menu.css +45 -42
  128. package/dist/css/rules/menubar.css +6 -6
  129. package/dist/css/rules/navigation-menu.css +69 -66
  130. package/dist/css/rules/number-field.css +22 -21
  131. package/dist/css/rules/otp-field.css +28 -27
  132. package/dist/css/rules/panel.css +105 -100
  133. package/dist/css/rules/popover.css +23 -20
  134. package/dist/css/rules/popup.css +15 -14
  135. package/dist/css/rules/preview-card.css +20 -19
  136. package/dist/css/rules/progress.css +3 -3
  137. package/dist/css/rules/radio-group.css +8 -8
  138. package/dist/css/rules/scroll-area.css +50 -39
  139. package/dist/css/rules/select.css +39 -36
  140. package/dist/css/rules/sizing.css +119 -116
  141. package/dist/css/rules/skeleton.css +11 -11
  142. package/dist/css/rules/slider.css +43 -43
  143. package/dist/css/rules/sparkline.css +21 -21
  144. package/dist/css/rules/spinner.css +9 -9
  145. package/dist/css/rules/stat.css +32 -32
  146. package/dist/css/rules/switch.css +28 -21
  147. package/dist/css/rules/syntax-highlighter.css +37 -36
  148. package/dist/css/rules/table.css +10 -10
  149. package/dist/css/rules/tabs.css +53 -52
  150. package/dist/css/rules/textarea.css +9 -7
  151. package/dist/css/rules/toast.css +94 -90
  152. package/dist/css/rules/toggle.css +12 -12
  153. package/dist/css/rules/toolbar.css +27 -27
  154. package/dist/css/rules/tooltip.css +14 -14
  155. package/dist/css/rules/tree.css +38 -38
  156. package/dist/css/scroll-area.css +1 -1
  157. package/dist/css/select.css +1 -1
  158. package/dist/css/separator.css +2 -2
  159. package/dist/css/sheet.css +2 -2
  160. package/dist/css/sizing.css +1 -1
  161. package/dist/css/skeleton.css +1 -1
  162. package/dist/css/slider.css +1 -1
  163. package/dist/css/sparkline.css +1 -1
  164. package/dist/css/spinner.css +1 -1
  165. package/dist/css/stat.css +1 -1
  166. package/dist/css/styles.css +17 -17
  167. package/dist/css/switch.css +1 -1
  168. package/dist/css/syntax-highlighter.css +1 -1
  169. package/dist/css/table.css +2 -2
  170. package/dist/css/tabs.css +1 -1
  171. package/dist/css/textarea.css +1 -1
  172. package/dist/css/toast.css +1 -1
  173. package/dist/css/toggle-group.css +1 -1
  174. package/dist/css/toggle.css +1 -1
  175. package/dist/css/toolbar.css +1 -1
  176. package/dist/css/tooltip.css +1 -1
  177. package/dist/css/tree.css +1 -1
  178. package/dist/css/typography.css +2 -2
  179. package/dist/date-picker.js +28 -8
  180. package/dist/dialog.d.ts +20 -8
  181. package/dist/dialog.js +11 -12
  182. package/dist/drawer.d.ts +12 -4
  183. package/dist/drawer.js +5 -5
  184. package/dist/element-part.d.ts +8 -0
  185. package/dist/element-part.js +21 -0
  186. package/dist/empty-state.d.ts +602 -24
  187. package/dist/empty-state.js +9 -9
  188. package/dist/field.d.ts +60 -36
  189. package/dist/field.js +6 -6
  190. package/dist/fieldset.d.ts +19 -11
  191. package/dist/fieldset.js +2 -2
  192. package/dist/file-upload.d.ts +8 -23
  193. package/dist/file-upload.js +21 -16
  194. package/dist/filter-bar.d.ts +30 -10
  195. package/dist/filter-bar.js +16 -18
  196. package/dist/form.js +1 -1
  197. package/dist/icon.d.ts +9 -2
  198. package/dist/icon.js +6 -6
  199. package/dist/index.d.ts +4 -4
  200. package/dist/index.js +2 -3
  201. package/dist/inline-message.d.ts +51 -27
  202. package/dist/inline-message.js +10 -11
  203. package/dist/input.d.ts +4 -2
  204. package/dist/input.js +3 -4
  205. package/dist/layout.d.ts +24 -12
  206. package/dist/layout.js +27 -27
  207. package/dist/link.d.ts +3 -1
  208. package/dist/link.js +3 -4
  209. package/dist/list.d.ts +43 -27
  210. package/dist/list.js +12 -13
  211. package/dist/markdown.d.ts +14 -6
  212. package/dist/markdown.js +28 -11
  213. package/dist/menu.d.ts +113 -57
  214. package/dist/menu.js +24 -25
  215. package/dist/menubar.d.ts +5 -3
  216. package/dist/menubar.js +1 -1
  217. package/dist/meter.d.ts +46 -26
  218. package/dist/meter.js +5 -5
  219. package/dist/native-select.d.ts +4 -2
  220. package/dist/native-select.js +2 -2
  221. package/dist/navigation-menu.d.ts +76 -40
  222. package/dist/navigation-menu.js +15 -16
  223. package/dist/number-field.d.ts +44 -19
  224. package/dist/number-field.js +12 -13
  225. package/dist/otp-field.d.ts +26 -9
  226. package/dist/otp-field.js +10 -11
  227. package/dist/page-header.js +3 -4
  228. package/dist/pagination.d.ts +11 -8
  229. package/dist/pagination.js +4 -5
  230. package/dist/panel.d.ts +3 -1
  231. package/dist/panel.js +5 -6
  232. package/dist/parts.d.ts +5 -7
  233. package/dist/parts.js +8 -16
  234. package/dist/popover.d.ts +20 -12
  235. package/dist/popover.js +3 -3
  236. package/dist/preview-card.d.ts +22 -10
  237. package/dist/preview-card.js +7 -8
  238. package/dist/progress.d.ts +46 -26
  239. package/dist/progress.js +5 -5
  240. package/dist/radio-group.d.ts +16 -8
  241. package/dist/radio-group.js +5 -5
  242. package/dist/scroll-area.d.ts +4 -2
  243. package/dist/scroll-area.js +6 -6
  244. package/dist/select.d.ts +3 -1
  245. package/dist/select.js +5 -5
  246. package/dist/separator.d.ts +5 -2
  247. package/dist/separator.js +3 -4
  248. package/dist/sheet.d.ts +12 -4
  249. package/dist/sheet.js +5 -5
  250. package/dist/size.d.ts +7 -0
  251. package/dist/size.js +9 -0
  252. package/dist/sizing.d.ts +8 -3
  253. package/dist/sizing.js +8 -10
  254. package/dist/skeleton.d.ts +3 -3
  255. package/dist/skeleton.js +4 -6
  256. package/dist/slider.d.ts +55 -31
  257. package/dist/slider.js +7 -7
  258. package/dist/sparkline.d.ts +5 -20
  259. package/dist/sparkline.js +5 -7
  260. package/dist/spinner.d.ts +4 -6
  261. package/dist/spinner.js +7 -8
  262. package/dist/stat.d.ts +34 -42
  263. package/dist/stat.js +9 -10
  264. package/dist/status.js +0 -1
  265. package/dist/switch.d.ts +17 -8
  266. package/dist/switch.js +4 -5
  267. package/dist/syntax-engine.js +9 -1
  268. package/dist/syntax-highlighter.d.ts +3 -7
  269. package/dist/syntax-highlighter.js +4 -4
  270. package/dist/syntax-highlighting.js +2 -2
  271. package/dist/table.d.ts +111 -75
  272. package/dist/table.js +32 -33
  273. package/dist/tabs.d.ts +46 -26
  274. package/dist/tabs.js +5 -5
  275. package/dist/textarea.d.ts +4 -2
  276. package/dist/textarea.js +3 -4
  277. package/dist/toast.d.ts +76 -42
  278. package/dist/toast.js +28 -28
  279. package/dist/toggle-group.js +1 -1
  280. package/dist/toggle.js +1 -1
  281. package/dist/tone-transition.d.ts +1 -1
  282. package/dist/tone-transition.js +9 -8
  283. package/dist/toolbar.d.ts +55 -31
  284. package/dist/toolbar.js +6 -6
  285. package/dist/tooltip.d.ts +4 -1
  286. package/dist/tooltip.js +2 -2
  287. package/dist/tree.d.ts +12 -1
  288. package/dist/tree.js +13 -9
  289. package/dist/typography.d.ts +3 -1
  290. package/dist/typography.js +6 -8
  291. package/package.json +6 -5
@@ -3,98 +3,121 @@
3
3
  surflane.sizes;
4
4
 
5
5
  @layer surflane.components {
6
+ /* The parts' sizes. Links and brands also render outside the shell, such as in a
7
+ * mobile Sheet, so the root holds them; set them on AppShell.Root to change one
8
+ * shell. The links' icon column is what the brand's mark and the rail line up on. */
9
+ :root {
10
+ --surf-app-shell-icon-column: 40px;
11
+ --surf-app-shell-brand-height: 80px;
12
+ --surf-app-shell-mark-size: 24px;
13
+ }
6
14
  /* Application frame slots: navigation state and product routing remain caller-owned.
7
15
  The shell is never rounded: its edge is the window's, or the edge of a container
8
16
  that frames it and clips it. Only the page surface inside it is rounded. */
9
- .pui-app-shell {
10
- --app-shell-inset: var(--space-3);
17
+ .surf-app-shell {
18
+ --surf-app-shell-inset: var(--surf-space-3);
11
19
  /* --app-shell-radius, if a caller still sets it, keeps deriving the page radius. */
12
- --app-shell-page-radius: max(
20
+ --surf-app-shell-page-radius: max(
13
21
  0px,
14
22
  calc(
15
- var(--app-shell-radius, var(--radius-sheet)) - var(--app-shell-inset)
23
+ var(--app-shell-radius, var(--surf-radius-sheet)) -
24
+ var(--surf-app-shell-inset)
16
25
  )
17
26
  );
18
- --app-shell-sidebar-width: 216px;
27
+ --surf-app-shell-sidebar-width: 216px;
19
28
  /* The collapsed sidebar's width. Set it on the shell for a narrower rail. */
20
- --app-shell-rail-width: 64px;
29
+ --surf-app-shell-rail-width: 64px;
21
30
  display: grid;
22
- grid-template-columns: var(--app-shell-sidebar-width) minmax(0, 1fr);
31
+ grid-template-columns: var(--surf-app-shell-sidebar-width) minmax(0, 1fr);
23
32
  grid-template-rows: auto minmax(0, 1fr);
24
- gap: var(--space-4);
33
+ gap: var(--surf-space-4);
25
34
  min-inline-size: 0;
26
- padding: var(--app-shell-inset);
27
- background: var(--chrome);
35
+ padding: var(--surf-app-shell-inset);
36
+ background: var(--surf-chrome);
28
37
  }
29
- .pui-app-shell[data-sidebar='collapsed'] {
30
- --app-shell-sidebar-width: var(--app-shell-rail-width);
38
+ .surf-app-shell[data-sidebar='collapsed'] {
39
+ --surf-app-shell-sidebar-width: var(--surf-app-shell-rail-width);
31
40
  }
32
- .pui-app-shell-header {
41
+ .surf-app-shell-header {
33
42
  grid-column: 1 / -1;
34
43
  display: flex;
35
44
  align-items: center;
36
45
  justify-content: space-between;
37
- gap: var(--space-3);
46
+ gap: var(--surf-space-3);
38
47
  min-inline-size: 0;
39
48
  }
40
- .pui-app-shell-sidebar {
49
+ .surf-app-shell-sidebar {
41
50
  display: flex;
42
51
  flex-direction: column;
43
- gap: var(--space-3);
52
+ gap: var(--surf-space-3);
44
53
  min-inline-size: 0;
45
54
  min-block-size: 0;
46
- padding-inline: var(--space-3);
55
+ padding-inline: var(--surf-space-3);
47
56
  }
48
- .pui-app-shell-content {
57
+ .surf-app-shell-content {
49
58
  min-inline-size: 0;
50
59
  min-block-size: 0;
51
- padding: var(--space-6);
52
- background: var(--canvas);
53
- border-radius: var(--app-shell-page-radius);
60
+ padding: var(--surf-space-6);
61
+ background: var(--surf-canvas);
62
+ border-radius: var(--surf-app-shell-page-radius);
54
63
  overflow-wrap: anywhere;
55
64
  }
56
- .pui-app-shell-footer {
65
+ .surf-app-shell-footer {
57
66
  margin-block-start: auto;
58
67
  flex: none;
59
68
  }
60
- .pui-app-shell-link {
69
+ /* A link, or a button such as the account's menu trigger, in the same row. */
70
+ .surf-app-shell-link {
71
+ box-sizing: border-box;
61
72
  display: grid;
62
- grid-template-columns: 40px minmax(0, 1fr);
73
+ grid-template-columns: var(--surf-app-shell-icon-column) minmax(0, 1fr);
63
74
  align-items: center;
64
- min-block-size: 40px;
65
- border-radius: var(--radius-md);
75
+ inline-size: 100%;
76
+ /* The icon's cell is square, so a row is as tall as the column is wide. */
77
+ min-block-size: var(--surf-app-shell-icon-column);
78
+ gap: 0;
79
+ padding: 0;
80
+ border: 0;
81
+ border-radius: var(--surf-radius-md);
82
+ background: transparent;
83
+ font: inherit;
84
+ text-align: start;
66
85
  text-decoration: none;
67
- color: var(--ink-body);
68
- transition: background-color var(--duration-fast) var(--ease-out);
86
+ color: var(--surf-ink-body);
87
+ cursor: pointer;
88
+ transition: background-color var(--surf-duration-fast) var(--surf-ease-out);
69
89
  }
70
- .pui-app-shell-link:hover {
71
- background: var(--interaction-hover-bg);
90
+ .surf-app-shell-link:hover {
91
+ background: var(--surf-interaction-hover-bg);
72
92
  }
73
- .pui-app-shell-link:active:not([aria-current='page']) {
74
- background: var(--interaction-active-bg);
93
+ .surf-app-shell-link:active:not([aria-current='page']) {
94
+ background: var(--surf-interaction-active-bg);
75
95
  }
76
- .pui-app-shell-link[aria-current='page'] {
77
- background: var(--selected);
78
- color: var(--ink);
79
- font-weight: var(--weight-medium);
96
+ .surf-app-shell-link[aria-current='page'] {
97
+ background: var(--surf-selected);
98
+ color: var(--surf-ink);
99
+ font-weight: var(--surf-weight-medium);
80
100
  }
81
- .pui-app-shell-link:focus-visible {
82
- outline: var(--focus-ring-width) solid var(--interaction-focus);
83
- outline-offset: var(--focus-ring-inset);
101
+ .surf-app-shell-link:focus-visible {
102
+ outline: var(--surf-focus-ring-width) solid var(--surf-interaction-focus);
103
+ outline-offset: var(--surf-focus-ring-inset);
84
104
  }
85
- .pui-app-shell-icon {
105
+ .surf-app-shell-icon {
86
106
  display: grid;
87
107
  place-items: center;
88
- inline-size: 40px;
108
+ inline-size: var(--surf-app-shell-icon-column);
89
109
  }
90
- .pui-app-shell-label {
110
+ .surf-app-shell-label {
91
111
  min-inline-size: 0;
92
112
  overflow: hidden;
93
113
  text-overflow: ellipsis;
94
114
  white-space: nowrap;
95
- padding-inline-end: var(--space-2);
115
+ padding-inline-end: var(--surf-space-2);
96
116
  }
97
- .pui-app-shell[data-sidebar='collapsed'] .pui-app-shell-label {
117
+ /* Only the sidebar collapses: a label in the header or the page stays. */
118
+ .surf-app-shell[data-sidebar='collapsed']
119
+ .surf-app-shell-sidebar
120
+ .surf-app-shell-label {
98
121
  position: absolute;
99
122
  inline-size: 1px;
100
123
  block-size: 1px;
@@ -102,54 +125,124 @@
102
125
  clip-path: inset(50%);
103
126
  overflow: hidden;
104
127
  }
128
+ /* The product's mark and name. */
129
+ .surf-app-shell-brand {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: var(--surf-space-2);
133
+ min-inline-size: 0;
134
+ color: var(--surf-ink);
135
+ text-decoration: none;
136
+ }
137
+ .surf-app-shell-brand-mark {
138
+ flex: none;
139
+ display: grid;
140
+ place-items: center;
141
+ }
142
+ .surf-app-shell-brand-mark > :where(svg, img) {
143
+ inline-size: var(--surf-app-shell-mark-size);
144
+ block-size: var(--surf-app-shell-mark-size);
145
+ }
146
+ .surf-app-shell-brand-text {
147
+ display: grid;
148
+ }
149
+ .surf-app-shell-brand-name,
150
+ .surf-app-shell-brand-description {
151
+ overflow: hidden;
152
+ text-overflow: ellipsis;
153
+ white-space: nowrap;
154
+ }
155
+ .surf-app-shell-brand-name {
156
+ font: var(--surf-weight-medium) var(--surf-type-subsection-size) /
157
+ var(--surf-type-subsection-leading) var(--surf-font-body);
158
+ letter-spacing: var(--surf-type-subsection-tracking);
159
+ }
160
+ .surf-app-shell-brand-description {
161
+ color: var(--surf-ink-muted);
162
+ font: var(--surf-weight-regular) var(--surf-type-caption-size) /
163
+ var(--surf-type-caption-leading) var(--surf-font-body);
164
+ letter-spacing: var(--surf-type-caption-tracking);
165
+ }
166
+ /* In the sidebar the brand is the top row, its mark on the links' icon column and
167
+ * its name on their label line. */
168
+ .surf-app-shell-sidebar > .surf-app-shell-brand {
169
+ flex: none;
170
+ block-size: var(--surf-app-shell-brand-height);
171
+ gap: 0;
172
+ }
173
+ .surf-app-shell-sidebar > .surf-app-shell-brand > .surf-app-shell-brand-mark {
174
+ inline-size: var(--surf-app-shell-icon-column);
175
+ }
176
+ /* Links stack with even gaps under an optional label that names the group. */
177
+ .surf-app-shell-nav {
178
+ display: grid;
179
+ align-content: start;
180
+ gap: var(--surf-space-1);
181
+ min-inline-size: 0;
182
+ }
183
+ .surf-app-shell-nav-label {
184
+ display: flex;
185
+ align-items: center;
186
+ min-block-size: var(--surf-space-6);
187
+ margin-block-end: var(--surf-space-1);
188
+ padding-inline: var(--surf-space-3);
189
+ color: var(--surf-ink-muted);
190
+ font: var(--surf-weight-regular) var(--surf-type-caption-size) /
191
+ var(--surf-type-caption-leading) var(--surf-font-body);
192
+ letter-spacing: var(--surf-type-caption-tracking);
193
+ }
105
194
  /* On a phone the frame costs more room than it gives: the page meets the screen's
106
195
  edges, and only the header keeps its inset. */
107
196
  @media (max-width: 760px) {
108
- .pui-app-shell {
197
+ .surf-app-shell {
109
198
  grid-template-columns: minmax(0, 1fr);
110
199
  grid-template-rows: auto minmax(0, 1fr);
111
200
  gap: 0;
112
201
  padding: 0;
113
202
  }
114
- .pui-app-shell > .pui-app-shell-header {
115
- padding: var(--app-shell-inset);
203
+ .surf-app-shell > .surf-app-shell-header {
204
+ padding: var(--surf-app-shell-inset);
116
205
  }
117
- .pui-app-shell-sidebar {
206
+ .surf-app-shell-sidebar {
118
207
  display: none;
119
208
  }
120
- .pui-app-shell-content {
121
- padding: var(--space-4);
209
+ .surf-app-shell-content {
210
+ padding: var(--surf-space-4);
122
211
  border-radius: 0;
123
212
  }
124
213
  }
125
214
  @media (max-width: 760px), (pointer: coarse) {
126
- .pui-app-shell-link {
127
- min-block-size: var(--control-target-size);
215
+ .surf-app-shell-link {
216
+ min-block-size: var(--surf-control-target-size);
128
217
  }
129
218
  }
130
219
  @media (prefers-reduced-motion: reduce) {
131
- .pui-app-shell-link {
220
+ .surf-app-shell-link {
132
221
  transition: none;
133
222
  }
134
223
  }
135
224
  @media (forced-colors: active) {
136
- .pui-app-shell-link[aria-current='page'] {
225
+ .surf-app-shell-link[aria-current='page'] {
137
226
  outline: 1px solid Highlight;
138
227
  }
139
228
  }
140
229
  /* Workspace variant: product sidebar owns the brand; the content scrollport is caller-provided. */
141
- .pui-app-shell[data-layout='workspace'] {
142
- --app-shell-sidebar-width: 224px;
143
- --app-shell-rail-width: 72px;
230
+ .surf-app-shell[data-layout='workspace'] {
231
+ --surf-app-shell-sidebar-width: 224px;
232
+ --surf-app-shell-rail-width: 72px;
233
+ /* The shell takes its container's height, the window's when the document fills
234
+ * it, so the sidebar stays while the content scrolls. */
235
+ block-size: 100%;
144
236
  grid-template-rows: minmax(0, 1fr);
145
237
  gap: 0;
146
238
  padding: 0;
147
- transition: grid-template-columns var(--duration-base) var(--ease-out);
239
+ transition: grid-template-columns var(--surf-duration-base)
240
+ var(--surf-ease-out);
148
241
  }
149
- .pui-app-shell[data-layout='workspace'][data-sidebar='collapsed'] {
150
- --app-shell-sidebar-width: var(--app-shell-rail-width);
242
+ .surf-app-shell[data-layout='workspace'][data-sidebar='collapsed'] {
243
+ --surf-app-shell-sidebar-width: var(--surf-app-shell-rail-width);
151
244
  }
152
- .pui-app-shell[data-layout='workspace'] > .pui-app-shell-sidebar {
245
+ .surf-app-shell[data-layout='workspace'] > .surf-app-shell-sidebar {
153
246
  position: relative;
154
247
  grid-row: 1;
155
248
  grid-column: 1;
@@ -157,7 +250,7 @@
157
250
  padding: 0;
158
251
  z-index: 1;
159
252
  }
160
- .pui-app-shell[data-layout='workspace'] > .pui-app-shell-content {
253
+ .surf-app-shell[data-layout='workspace'] > .surf-app-shell-content {
161
254
  grid-row: 1;
162
255
  grid-column: 2;
163
256
  margin: 0;
@@ -165,63 +258,162 @@
165
258
  background: transparent;
166
259
  border-radius: 0;
167
260
  }
261
+ /* The toggle sits on the sidebar's edge, a round button half over the content.
262
+ * Collapsed, it centers in the rail where the brand was. */
263
+ .surf-app-shell[data-layout='workspace']
264
+ > .surf-app-shell-sidebar
265
+ > .surf-app-shell-toggle {
266
+ --surf-app-shell-toggle-size: var(--surf-space-8);
267
+ position: absolute;
268
+ inset-block-start: var(--surf-space-5);
269
+ inset-inline-end: calc(var(--surf-app-shell-toggle-size) / -2);
270
+ border: 1px solid var(--surf-line);
271
+ background: var(--surf-canvas);
272
+ z-index: 1;
273
+ }
274
+ .surf-app-shell[data-layout='workspace'][data-sidebar='collapsed']
275
+ > .surf-app-shell-sidebar
276
+ > .surf-app-shell-toggle {
277
+ --surf-app-shell-toggle-size: var(--surf-space-10);
278
+ inset-inline-end: calc(
279
+ (var(--surf-app-shell-rail-width) - var(--surf-app-shell-toggle-size)) / 2
280
+ );
281
+ border-color: transparent;
282
+ background: transparent;
283
+ }
284
+ /* A ScrollArea in the sidebar takes the room between the brand and the footer, and
285
+ * one in the content fills it, so the menu and the page scroll on their own. */
286
+ .surf-app-shell[data-layout='workspace']
287
+ > .surf-app-shell-sidebar
288
+ > .surf-scroll-root {
289
+ flex: 1;
290
+ min-block-size: 0;
291
+ }
292
+ .surf-app-shell[data-layout='workspace']
293
+ > .surf-app-shell-sidebar
294
+ > .surf-scroll-root
295
+ > .surf-scroll-viewport {
296
+ block-size: 100%;
297
+ }
298
+ .surf-app-shell[data-layout='workspace']
299
+ > .surf-app-shell-sidebar
300
+ > .surf-app-shell-brand {
301
+ padding-inline: var(--surf-space-4);
302
+ }
303
+ /* Collapsed, the toggle takes the brand's place on the rail. */
304
+ .surf-app-shell[data-layout='workspace'][data-sidebar='collapsed']
305
+ > .surf-app-shell-sidebar
306
+ > .surf-app-shell-brand {
307
+ visibility: hidden;
308
+ }
309
+ .surf-app-shell[data-layout='workspace']
310
+ > .surf-app-shell-sidebar
311
+ .surf-app-shell-nav {
312
+ padding: 0 var(--surf-space-4) var(--surf-space-4);
313
+ }
314
+ .surf-app-shell[data-layout='workspace']
315
+ > .surf-app-shell-content
316
+ > .surf-scroll-root,
317
+ .surf-app-shell[data-layout='workspace']
318
+ > .surf-app-shell-content
319
+ > .surf-scroll-root
320
+ > .surf-scroll-viewport {
321
+ block-size: 100%;
322
+ min-block-size: 0;
323
+ }
324
+ /* The page stretches to the bottom when it is shorter than the content slot. */
325
+ .surf-app-shell[data-layout='workspace']
326
+ > .surf-app-shell-content
327
+ > .surf-scroll-root
328
+ > .surf-scroll-viewport
329
+ > .surf-scroll-content {
330
+ display: grid;
331
+ }
168
332
  /* The page surface: concentric with the shell, inset on every side but the
169
333
  * sidebar's. Stretch or size it from its container: a percentage height here
170
334
  * would resolve against a scroll content that sizes from the page itself. */
171
- .pui-app-shell-page {
335
+ .surf-app-shell-page {
172
336
  box-sizing: border-box;
173
337
  min-inline-size: 0;
174
- margin: var(--app-shell-inset);
338
+ margin: var(--surf-app-shell-inset);
175
339
  margin-inline-start: 0;
176
- padding: var(--space-6);
177
- background: var(--canvas);
178
- border-radius: var(--app-shell-page-radius);
340
+ padding: var(--surf-space-6);
341
+ background: var(--surf-canvas);
342
+ border-radius: var(--surf-app-shell-page-radius);
179
343
  }
180
344
  /* On a phone the page meets the screen's edges, below the mobile header. */
181
345
  @media (max-width: 760px) {
182
- .pui-app-shell-page {
346
+ .surf-app-shell-page {
183
347
  margin: 0;
184
- padding: var(--space-4);
348
+ padding: var(--surf-space-4);
185
349
  border-radius: 0;
186
350
  }
187
351
  }
188
- .pui-app-shell[data-layout='workspace'] .pui-app-shell-footer {
189
- padding: var(--space-4);
352
+ .surf-app-shell[data-layout='workspace'] .surf-app-shell-footer {
353
+ padding: var(--surf-space-4);
190
354
  }
191
- .pui-app-shell[data-layout='workspace'] .pui-app-shell-label {
355
+ .surf-app-shell[data-layout='workspace'] .surf-app-shell-label {
192
356
  transition:
193
- opacity 80ms var(--ease-out) 160ms,
357
+ opacity 80ms var(--surf-ease-out) 160ms,
194
358
  visibility 0s 160ms;
195
359
  }
196
- .pui-app-shell[data-layout='workspace'][data-sidebar='collapsed']
197
- .pui-app-shell-label {
360
+ .surf-app-shell[data-layout='workspace'][data-sidebar='collapsed']
361
+ .surf-app-shell-sidebar
362
+ .surf-app-shell-label {
198
363
  opacity: 0;
199
364
  visibility: hidden;
200
365
  transition: none;
201
366
  }
202
367
  @media (min-width: 761px) {
203
- .pui-app-shell[data-layout='workspace'] > .pui-app-shell-header {
368
+ .surf-app-shell[data-layout='workspace'] > .surf-app-shell-header {
204
369
  display: none;
205
370
  }
206
371
  }
207
372
  @media (max-width: 760px) {
208
- .pui-app-shell[data-layout='workspace'] {
373
+ .surf-app-shell[data-layout='workspace'] {
209
374
  grid-template-columns: minmax(0, 1fr);
210
375
  grid-template-rows: auto minmax(0, 1fr);
211
376
  }
212
- .pui-app-shell[data-layout='workspace'] > .pui-app-shell-header {
213
- padding: var(--space-3);
377
+ .surf-app-shell[data-layout='workspace'] > .surf-app-shell-header {
378
+ padding: var(--surf-space-3);
214
379
  }
215
- .pui-app-shell[data-layout='workspace'] > .pui-app-shell-content {
380
+ .surf-app-shell[data-layout='workspace'] > .surf-app-shell-content {
216
381
  grid-column: 1;
217
382
  grid-row: 2;
218
383
  margin: 0;
219
384
  }
220
385
  }
221
386
  @media (prefers-reduced-motion: reduce) {
222
- .pui-app-shell[data-layout='workspace'],
223
- .pui-app-shell[data-layout='workspace'] .pui-app-shell-label {
387
+ .surf-app-shell[data-layout='workspace'],
388
+ .surf-app-shell[data-layout='workspace'] .surf-app-shell-label {
224
389
  transition: none;
225
390
  }
226
391
  }
227
392
  }
393
+ @layer surflane.sizes {
394
+ /* A row rendered as a Button, such as Menu.Trigger, keeps the row's shape and the
395
+ * sidebar's text over the button's size scheme. */
396
+ .surf-app-shell-link.surf-button {
397
+ block-size: auto;
398
+ min-block-size: var(--surf-app-shell-icon-column);
399
+ padding: 0;
400
+ font-size: inherit;
401
+ line-height: inherit;
402
+ }
403
+ @media (max-width: 760px), (pointer: coarse) {
404
+ .surf-app-shell-link.surf-button {
405
+ min-block-size: var(--surf-control-target-size);
406
+ }
407
+ }
408
+ /* Above the icon button's size scheme: the edge toggle is a circle of its own size. */
409
+ .surf-app-shell[data-layout='workspace']
410
+ > .surf-app-shell-sidebar
411
+ > .surf-app-shell-toggle {
412
+ inline-size: var(--surf-app-shell-toggle-size);
413
+ block-size: var(--surf-app-shell-toggle-size);
414
+ min-inline-size: var(--surf-app-shell-toggle-size);
415
+ min-block-size: var(--surf-app-shell-toggle-size);
416
+ padding: 0;
417
+ border-radius: var(--surf-radius-full);
418
+ }
419
+ }
@@ -3,15 +3,15 @@
3
3
  surflane.sizes;
4
4
 
5
5
  @layer surflane.sizes {
6
- :where([data-ui-size], [data-ui-size] *).pui-avatar {
7
- width: var(--ui-avatar);
8
- height: var(--ui-avatar);
6
+ :where([data-ui-size], [data-ui-size] *).surf-avatar {
7
+ width: var(--surf-ui-avatar);
8
+ height: var(--surf-ui-avatar);
9
9
  }
10
- :where([data-ui-size], [data-ui-size] *).pui-avatar[data-ui-size] {
10
+ :where([data-ui-size], [data-ui-size] *).surf-avatar[data-ui-size] {
11
11
  font-size: clamp(
12
- var(--type-caption-size),
13
- calc(var(--ui-avatar) / 3),
14
- var(--size-font-large)
12
+ var(--surf-type-caption-size),
13
+ calc(var(--surf-ui-avatar) / 3),
14
+ var(--surf-size-font-large)
15
15
  );
16
16
  }
17
17
  }
@@ -3,15 +3,15 @@
3
3
  surflane.sizes;
4
4
 
5
5
  @layer surflane.sizes {
6
- :where([data-ui-size], [data-ui-size] *).pui-badge {
7
- padding: var(--ui-badge-padding-y) var(--ui-badge-padding-x);
8
- font-size: var(--ui-badge-font);
6
+ :where([data-ui-size], [data-ui-size] *).surf-badge {
7
+ padding: var(--surf-ui-badge-padding-y) var(--surf-ui-badge-padding-x);
8
+ font-size: var(--surf-ui-badge-font);
9
9
  }
10
10
  @media (forced-colors: active) {
11
- :where([data-ui-size], [data-ui-size] *).pui-badge {
11
+ :where([data-ui-size], [data-ui-size] *).surf-badge {
12
12
  border: 1px solid CanvasText;
13
- padding: calc(var(--ui-badge-padding-y) - 1px)
14
- calc(var(--ui-badge-padding-x) - 1px);
13
+ padding: calc(var(--surf-ui-badge-padding-y) - 1px)
14
+ calc(var(--surf-ui-badge-padding-x) - 1px);
15
15
  }
16
16
  }
17
17
  }
@@ -3,30 +3,30 @@
3
3
  surflane.sizes;
4
4
 
5
5
  @layer surflane.components {
6
- .pui-toggle-group,
7
- .pui-toolbar,
8
- .pui-menubar {
6
+ .surf-toggle-group,
7
+ .surf-toolbar,
8
+ .surf-menubar {
9
9
  display: flex;
10
10
  flex-wrap: wrap;
11
11
  align-items: center;
12
- gap: var(--space-1);
12
+ gap: var(--surf-space-1);
13
13
  min-width: 0;
14
14
  }
15
- .pui-toggle-group[data-orientation='vertical'],
16
- .pui-toolbar[data-orientation='vertical'],
17
- .pui-menubar[data-orientation='vertical'] {
15
+ .surf-toggle-group[data-orientation='vertical'],
16
+ .surf-toolbar[data-orientation='vertical'],
17
+ .surf-menubar[data-orientation='vertical'] {
18
18
  flex-direction: column;
19
19
  align-items: flex-start;
20
20
  width: fit-content;
21
21
  max-width: 100%;
22
22
  }
23
- .pui-toggle,
24
- .pui-toolbar-button {
23
+ .surf-toggle,
24
+ .surf-toolbar-button {
25
25
  position: relative;
26
26
  }
27
27
  @media (forced-colors: active) {
28
- .pui-toggle[data-pressed]::after,
29
- .pui-toolbar-button[aria-pressed='true']::after {
28
+ .surf-toggle[data-pressed]::after,
29
+ .surf-toolbar-button[aria-pressed='true']::after {
30
30
  content: '';
31
31
  position: absolute;
32
32
  inset: 3px;
@@ -3,7 +3,7 @@
3
3
  surflane.sizes;
4
4
 
5
5
  @layer surflane.components {
6
- @keyframes pui-progress-pulse {
6
+ @keyframes surf-progress-pulse {
7
7
  50% {
8
8
  opacity: 0.45;
9
9
  }
@@ -11,35 +11,35 @@
11
11
  /* Touch feedback is each control's own hover and pressed layer, drawn in its own
12
12
  shape. The browser's tap highlight is a rectangle over the box, so it is off. */
13
13
  :where(
14
- .pui-button,
15
- .pui-tabs-tab,
16
- .pui-disclosure-trigger,
17
- .pui-app-shell-link,
18
- .pui-tree-item,
19
- .pui-tree-toggle,
20
- .pui-chart-legend-button,
21
- .pui-checkbox,
22
- .pui-radio,
23
- .pui-switch,
24
- .pui-choice-label,
25
- .pui-select-trigger,
26
- .pui-select-item,
27
- .pui-combobox-item,
28
- .pui-combobox-action,
29
- .pui-combobox-chip-remove,
30
- .pui-menu-item,
31
- .pui-navigation-trigger,
32
- .pui-navigation-link,
33
- .pui-link,
34
- .pui-breadcrumb-item a,
35
- .pui-calendar-day,
36
- .pui-calendar-nav,
37
- .pui-date-trigger,
38
- .pui-file-trigger,
39
- .pui-number-step,
40
- .pui-slider-control,
41
- .pui-toast-action,
42
- .pui-toast-close
14
+ .surf-button,
15
+ .surf-tabs-tab,
16
+ .surf-disclosure-trigger,
17
+ .surf-app-shell-link,
18
+ .surf-tree-item,
19
+ .surf-tree-toggle,
20
+ .surf-chart-legend-button,
21
+ .surf-checkbox,
22
+ .surf-radio,
23
+ .surf-switch,
24
+ .surf-choice-label,
25
+ .surf-select-trigger,
26
+ .surf-select-item,
27
+ .surf-combobox-item,
28
+ .surf-combobox-action,
29
+ .surf-combobox-chip-remove,
30
+ .surf-menu-item,
31
+ .surf-navigation-trigger,
32
+ .surf-navigation-link,
33
+ .surf-link,
34
+ .surf-breadcrumb-item a,
35
+ .surf-calendar-day,
36
+ .surf-calendar-nav,
37
+ .surf-date-trigger,
38
+ .surf-file-trigger,
39
+ .surf-number-step,
40
+ .surf-slider-control,
41
+ .surf-toast-action,
42
+ .surf-toast-close
43
43
  ) {
44
44
  -webkit-tap-highlight-color: transparent;
45
45
  }