@surflane/ui 0.5.0 → 0.6.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 (175) hide show
  1. package/README.md +1 -1
  2. package/dist/app-shell.d.ts +44 -3
  3. package/dist/app-shell.js +81 -8
  4. package/dist/bottom-navigation.d.ts +66 -0
  5. package/dist/bottom-navigation.js +36 -0
  6. package/dist/chart.d.ts +16 -0
  7. package/dist/chart.js +103 -48
  8. package/dist/css/accordion.css +11 -0
  9. package/dist/css/alert-dialog.css +11 -0
  10. package/{src → dist/css}/all.css +1 -1
  11. package/dist/css/app-shell.css +12 -0
  12. package/dist/css/autocomplete.css +15 -0
  13. package/dist/css/avatar.css +10 -0
  14. package/dist/css/badge.css +10 -0
  15. package/dist/css/bottom-navigation.css +8 -0
  16. package/dist/css/breadcrumbs.css +12 -0
  17. package/dist/css/button.css +8 -0
  18. package/dist/css/card.css +11 -0
  19. package/dist/css/chart.css +13 -0
  20. package/dist/css/checkbox-group.css +9 -0
  21. package/dist/css/checkbox.css +9 -0
  22. package/dist/css/choice-label.css +9 -0
  23. package/dist/css/code.css +13 -0
  24. package/dist/css/collapsible.css +11 -0
  25. package/dist/css/combobox.css +14 -0
  26. package/dist/css/context-menu.css +15 -0
  27. package/dist/css/date-picker.css +12 -0
  28. package/dist/css/dialog.css +10 -0
  29. package/dist/css/drawer.css +11 -0
  30. package/dist/css/empty-state.css +9 -0
  31. package/dist/css/field.css +10 -0
  32. package/dist/css/fieldset.css +8 -0
  33. package/dist/css/file-upload.css +17 -0
  34. package/dist/css/filter-bar.css +8 -0
  35. package/dist/css/form.css +8 -0
  36. package/dist/css/icon.css +8 -0
  37. package/dist/css/inline-message.css +10 -0
  38. package/dist/css/input.css +9 -0
  39. package/dist/css/layout.css +9 -0
  40. package/dist/css/link.css +9 -0
  41. package/dist/css/list.css +9 -0
  42. package/dist/css/markdown.css +18 -0
  43. package/dist/css/menu.css +14 -0
  44. package/dist/css/menubar.css +9 -0
  45. package/dist/css/meter.css +9 -0
  46. package/dist/css/native-select.css +13 -0
  47. package/dist/css/navigation-menu.css +11 -0
  48. package/dist/css/number-field.css +11 -0
  49. package/dist/css/otp-field.css +10 -0
  50. package/dist/css/page-header.css +11 -0
  51. package/dist/css/pagination.css +11 -0
  52. package/dist/css/popover.css +9 -0
  53. package/dist/css/preview-card.css +11 -0
  54. package/dist/css/progress.css +9 -0
  55. package/dist/css/radio-group.css +9 -0
  56. package/dist/css/rules/accordion.css +21 -0
  57. package/dist/css/rules/alert-dialog.css +23 -0
  58. package/dist/css/rules/app-shell.css +220 -0
  59. package/dist/css/rules/autocomplete.css +3 -0
  60. package/dist/css/rules/avatar.css +17 -0
  61. package/dist/css/rules/badge.css +17 -0
  62. package/dist/css/rules/bar.css +38 -0
  63. package/dist/css/rules/base.css +46 -0
  64. package/dist/css/rules/bottom-navigation.css +142 -0
  65. package/dist/css/rules/breadcrumbs.css +9 -0
  66. package/dist/css/rules/button.css +131 -0
  67. package/dist/css/rules/card.css +10 -0
  68. package/dist/css/rules/chart.css +256 -0
  69. package/dist/css/rules/checkbox-group.css +3 -0
  70. package/dist/css/rules/checkbox.css +25 -0
  71. package/dist/css/rules/choice-label.css +52 -0
  72. package/dist/css/rules/choice.css +104 -0
  73. package/dist/css/rules/code.css +9 -0
  74. package/dist/css/rules/collapsible.css +12 -0
  75. package/dist/css/rules/combobox.css +177 -0
  76. package/dist/css/rules/context-menu.css +9 -0
  77. package/dist/css/rules/date-picker.css +301 -0
  78. package/dist/css/rules/dialog.css +160 -0
  79. package/dist/css/rules/disclosure.css +107 -0
  80. package/dist/css/rules/drawer.css +18 -0
  81. package/dist/css/rules/empty-state.css +9 -0
  82. package/dist/css/rules/field-control.css +70 -0
  83. package/dist/css/rules/field.css +56 -0
  84. package/dist/css/rules/fieldset.css +23 -0
  85. package/dist/css/rules/file-upload.css +156 -0
  86. package/dist/css/rules/filter-bar.css +56 -0
  87. package/dist/css/rules/form.css +15 -0
  88. package/dist/css/rules/gauge.css +61 -0
  89. package/dist/css/rules/icon.css +27 -0
  90. package/dist/css/rules/inline-message.css +10 -0
  91. package/dist/css/rules/input-group.css +69 -0
  92. package/dist/css/rules/input.css +33 -0
  93. package/dist/css/rules/item.css +14 -0
  94. package/dist/css/rules/layout.css +3 -0
  95. package/dist/css/rules/link.css +9 -0
  96. package/dist/css/rules/list.css +10 -0
  97. package/dist/css/rules/markdown.css +63 -0
  98. package/dist/css/rules/menu.css +97 -0
  99. package/dist/css/rules/menubar.css +18 -0
  100. package/dist/css/rules/meter.css +3 -0
  101. package/dist/css/rules/native-select.css +3 -0
  102. package/dist/css/rules/navigation-menu.css +159 -0
  103. package/dist/css/rules/number-field.css +55 -0
  104. package/dist/css/rules/otp-field.css +68 -0
  105. package/dist/css/rules/page-header.css +3 -0
  106. package/dist/css/rules/pagination.css +3 -0
  107. package/dist/css/rules/panel.css +221 -0
  108. package/dist/css/rules/popover.css +41 -0
  109. package/dist/css/rules/popup.css +27 -0
  110. package/dist/css/rules/preview-card.css +60 -0
  111. package/dist/css/rules/progress.css +14 -0
  112. package/dist/css/rules/radio-group.css +26 -0
  113. package/dist/css/rules/scroll-area.css +101 -0
  114. package/dist/css/rules/select.css +88 -0
  115. package/dist/css/rules/separator.css +3 -0
  116. package/dist/css/rules/sheet.css +3 -0
  117. package/dist/css/rules/sizing.css +140 -0
  118. package/dist/css/rules/skeleton.css +41 -0
  119. package/dist/css/rules/slider.css +123 -0
  120. package/dist/css/rules/sparkline.css +52 -0
  121. package/dist/css/rules/spinner.css +38 -0
  122. package/dist/css/rules/stat.css +59 -0
  123. package/dist/css/rules/switch.css +50 -0
  124. package/dist/css/rules/syntax-highlighter.css +82 -0
  125. package/dist/css/rules/table.css +28 -0
  126. package/dist/css/rules/tabs.css +126 -0
  127. package/dist/css/rules/textarea.css +21 -0
  128. package/dist/css/rules/toast.css +247 -0
  129. package/dist/css/rules/toggle-group.css +3 -0
  130. package/dist/css/rules/toggle.css +27 -0
  131. package/dist/css/rules/toolbar.css +62 -0
  132. package/dist/css/rules/tooltip.css +38 -0
  133. package/dist/css/rules/tree.css +98 -0
  134. package/dist/css/rules/typography.css +3 -0
  135. package/dist/css/scroll-area.css +8 -0
  136. package/dist/css/select.css +12 -0
  137. package/dist/css/separator.css +9 -0
  138. package/dist/css/sheet.css +11 -0
  139. package/dist/css/sizing.css +7 -0
  140. package/dist/css/skeleton.css +8 -0
  141. package/dist/css/slider.css +8 -0
  142. package/dist/css/sparkline.css +8 -0
  143. package/dist/css/spinner.css +8 -0
  144. package/dist/css/stat.css +9 -0
  145. package/dist/css/styles.css +100 -0
  146. package/dist/css/switch.css +9 -0
  147. package/dist/css/syntax-highlighter.css +9 -0
  148. package/dist/css/table.css +12 -0
  149. package/dist/css/tabs.css +8 -0
  150. package/dist/css/textarea.css +10 -0
  151. package/dist/css/toast.css +11 -0
  152. package/dist/css/toggle-group.css +9 -0
  153. package/dist/css/toggle.css +10 -0
  154. package/dist/css/toolbar.css +12 -0
  155. package/dist/css/tooltip.css +9 -0
  156. package/dist/css/tree.css +10 -0
  157. package/dist/css/typography.css +9 -0
  158. package/dist/format.d.ts +25 -0
  159. package/dist/format.js +42 -0
  160. package/dist/icon.d.ts +1 -0
  161. package/dist/icon.js +1 -0
  162. package/dist/index.d.ts +7 -3
  163. package/dist/index.js +6 -2
  164. package/dist/sparkline.d.ts +41 -0
  165. package/dist/sparkline.js +50 -0
  166. package/dist/stat.d.ts +59 -0
  167. package/dist/stat.js +26 -0
  168. package/dist/status.d.ts +1 -1
  169. package/dist/status.js +1 -0
  170. package/dist/toast.d.ts +57 -1
  171. package/dist/toast.js +73 -2
  172. package/dist/tooltip.d.ts +9 -3
  173. package/dist/tooltip.js +4 -4
  174. package/package.json +90 -7
  175. package/src/styles.css +0 -3948
@@ -0,0 +1,60 @@
1
+ /* Preview Card, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-preview-card {
7
+ box-sizing: border-box;
8
+ width: 320px;
9
+ max-width: min(calc(100vw - 24px), var(--available-width));
10
+ max-height: var(--available-height);
11
+ overflow: auto;
12
+ overscroll-behavior: contain;
13
+ scrollbar-width: thin;
14
+ padding: var(--space-5);
15
+ border: 1px solid var(--menu-border);
16
+ border-radius: var(--radius-md);
17
+ background: var(--menu-background);
18
+ color: var(--ink);
19
+ box-shadow: var(--shadow-float);
20
+ font: var(--weight-regular) var(--type-body-size)/var(--type-body-leading)
21
+ var(--font-body);
22
+ letter-spacing: var(--type-body-tracking);
23
+ overflow-wrap: anywhere;
24
+ outline: none;
25
+ transform: translateY(0);
26
+ opacity: 1;
27
+ transition:
28
+ opacity var(--dialog-enter-duration) var(--ease-out),
29
+ transform var(--dialog-enter-duration) var(--ease-out);
30
+ }
31
+ .pui-preview-card > :first-child {
32
+ margin-top: 0;
33
+ }
34
+ .pui-preview-card > :last-child {
35
+ margin-bottom: 0;
36
+ }
37
+ .pui-preview-card[data-starting-style] {
38
+ opacity: 0;
39
+ transform: translateY(6px);
40
+ }
41
+ .pui-preview-card[data-ending-style] {
42
+ transition-duration: 0s;
43
+ }
44
+ .pui-preview-card[data-instant] {
45
+ transition-duration: 0s;
46
+ }
47
+ @media (prefers-reduced-motion: reduce) {
48
+ .pui-preview-card {
49
+ transition: none;
50
+ transform: none;
51
+ }
52
+ }
53
+ @media (forced-colors: active) {
54
+ .pui-preview-card {
55
+ border-color: CanvasText;
56
+ background: Canvas;
57
+ color: CanvasText;
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,14 @@
1
+ /* Progress, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-progress .pui-gauge-indicator {
7
+ background: var(--brand);
8
+ }
9
+ @media (forced-colors: active) {
10
+ .pui-progress .pui-gauge-indicator {
11
+ background: CanvasText;
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,26 @@
1
+ /* Radio Group, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-radio {
7
+ border-radius: var(--radius-full);
8
+ }
9
+ .pui-radio-indicator {
10
+ width: 8px;
11
+ height: 8px;
12
+ border-radius: var(--radius-full);
13
+ background: currentColor;
14
+ }
15
+ @media (prefers-reduced-motion: reduce) {
16
+ .pui-radio {
17
+ transition: none;
18
+ }
19
+ }
20
+ }
21
+ @layer surflane.sizes {
22
+ :where([data-ui-size], [data-ui-size] *).pui-radio-indicator {
23
+ width: calc(var(--control-choice-size) * 0.4);
24
+ height: calc(var(--control-choice-size) * 0.4);
25
+ }
26
+ }
@@ -0,0 +1,101 @@
1
+ /* Scroll Area, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-scroll-root {
7
+ position: relative;
8
+ min-width: 0;
9
+ max-width: 100%;
10
+ }
11
+ .pui-scroll-viewport {
12
+ max-width: 100%;
13
+ overscroll-behavior: auto;
14
+ scrollbar-width: none !important;
15
+ }
16
+ .pui-scroll-viewport::-webkit-scrollbar {
17
+ display: none;
18
+ }
19
+ /* A horizontal scroller fades the edge that hides more content, so a cut-off table
20
+ * or code line reads as scrollable before its scrollbar appears, on touch too. */
21
+ .pui-scroll-root[data-overflow-x-end] > .pui-scroll-viewport {
22
+ mask-image: linear-gradient(to left, transparent, #000 var(--space-6));
23
+ }
24
+ .pui-scroll-root[data-overflow-x-start] > .pui-scroll-viewport {
25
+ mask-image: linear-gradient(to right, transparent, #000 var(--space-6));
26
+ }
27
+ .pui-scroll-root[data-overflow-x-start][data-overflow-x-end]
28
+ > .pui-scroll-viewport {
29
+ mask-image: linear-gradient(
30
+ to right,
31
+ transparent,
32
+ #000 var(--space-6),
33
+ #000 calc(100% - var(--space-6)),
34
+ transparent
35
+ );
36
+ }
37
+ .pui-scrollbar {
38
+ display: flex;
39
+ user-select: none;
40
+ touch-action: none;
41
+ padding: 2px;
42
+ background: transparent;
43
+ z-index: 1;
44
+ opacity: 0;
45
+ transition: opacity var(--duration-fast) var(--ease-out);
46
+ }
47
+ .pui-scrollbar[data-scrolling],
48
+ .pui-scrollbar:hover,
49
+ .pui-scroll-root[data-scroll-near-x]
50
+ > .pui-scrollbar[data-orientation='horizontal'],
51
+ .pui-scroll-root[data-scroll-near-y]
52
+ > .pui-scrollbar[data-orientation='vertical'],
53
+ .pui-scroll-root[data-scroll-dragging='horizontal']
54
+ > .pui-scrollbar[data-orientation='horizontal'],
55
+ .pui-scroll-root[data-scroll-dragging='vertical']
56
+ > .pui-scrollbar[data-orientation='vertical'],
57
+ .pui-scroll-root:has(> .pui-scroll-viewport:focus-visible) > .pui-scrollbar {
58
+ opacity: 1;
59
+ }
60
+ .pui-scrollbar[data-orientation='horizontal'] {
61
+ height: 10px;
62
+ position: absolute;
63
+ bottom: 0;
64
+ left: 0;
65
+ right: 0;
66
+ }
67
+ .pui-scrollbar[data-orientation='vertical'] {
68
+ flex-direction: column;
69
+ width: 10px;
70
+ position: absolute;
71
+ top: 0;
72
+ bottom: 0;
73
+ right: 0;
74
+ }
75
+ .pui-scroll-thumb {
76
+ flex: none;
77
+ border-radius: var(--radius-full);
78
+ background: var(--ink-muted);
79
+ opacity: 0.45;
80
+ }
81
+ .pui-scrollbar:hover .pui-scroll-thumb {
82
+ opacity: 0.8;
83
+ }
84
+ /* On touch-only screens a scrollbar is a position indicator, as native mobile
85
+ * scrollbars are: content scrolls by swiping, so the bar overlaying its edge
86
+ * never takes a tap meant for the link or control beneath it. */
87
+ @media (hover: none) and (pointer: coarse) {
88
+ .pui-scrollbar {
89
+ pointer-events: none;
90
+ }
91
+ }
92
+ @media (forced-colors: active) {
93
+ .pui-scrollbar {
94
+ opacity: 1;
95
+ }
96
+ .pui-scrollbar .pui-scroll-thumb {
97
+ background: CanvasText;
98
+ opacity: 1;
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,88 @@
1
+ /* Select, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-select-trigger {
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: space-between;
10
+ gap: var(--space-2);
11
+ text-align: start;
12
+ cursor: pointer;
13
+ }
14
+ .pui-select-trigger > span:first-child {
15
+ overflow: hidden;
16
+ text-overflow: ellipsis;
17
+ white-space: nowrap;
18
+ }
19
+ .pui-select-icon {
20
+ display: flex;
21
+ align-items: center;
22
+ flex: none;
23
+ color: var(--ink-muted);
24
+ }
25
+ .pui-select-popup {
26
+ min-width: var(--anchor-width);
27
+ max-height: min(360px, var(--available-height));
28
+ overflow: auto;
29
+ padding: var(--space-1);
30
+ overscroll-behavior: contain;
31
+ scrollbar-width: thin;
32
+ }
33
+ .pui-select-item {
34
+ position: relative;
35
+ display: flex;
36
+ align-items: center;
37
+ gap: var(--space-2);
38
+ min-height: var(--control-height);
39
+ padding: max(var(--space-1), calc((var(--control-height) - 1lh) / 2))
40
+ var(--space-3);
41
+ padding-inline-start: calc(
42
+ var(--space-3) + var(--icon-size-sm) + var(--space-2)
43
+ );
44
+ border-radius: var(--control-radius);
45
+ cursor: default;
46
+ outline: none;
47
+ overflow-wrap: anywhere;
48
+ }
49
+ .pui-select-item[data-highlighted] {
50
+ background: var(--menu-hover-background);
51
+ }
52
+ .pui-select-item[data-selected] {
53
+ font-weight: var(--weight-medium);
54
+ }
55
+ .pui-select-item[data-disabled] {
56
+ opacity: var(--control-disabled-opacity);
57
+ }
58
+ .pui-select-check {
59
+ position: absolute;
60
+ inset-inline-start: var(--space-3);
61
+ display: flex;
62
+ width: var(--icon-size-sm);
63
+ }
64
+ /* A group heading starts where its options' text does, past the check column. */
65
+ .pui-select-group-label {
66
+ padding-inline-start: calc(
67
+ var(--space-3) + var(--icon-size-sm) + var(--space-2)
68
+ );
69
+ }
70
+ }
71
+ @layer surflane.sizes {
72
+ :where([data-ui-size], [data-ui-size] *):is(.pui-select-trigger) {
73
+ font-size: var(--ui-font);
74
+ line-height: var(--ui-leading);
75
+ }
76
+ :where([data-ui-size], [data-ui-size] *):is(.pui-select-item) {
77
+ min-block-size: var(--ui-row);
78
+ font-size: var(--ui-font);
79
+ line-height: var(--ui-leading);
80
+ }
81
+ :where([data-ui-size], [data-ui-size] *):is(.pui-select-item) {
82
+ box-sizing: border-box;
83
+ padding-block: max(
84
+ var(--space-1),
85
+ calc((var(--ui-row) - var(--ui-leading)) / 2)
86
+ );
87
+ }
88
+ }
@@ -0,0 +1,3 @@
1
+ /* Separator, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
@@ -0,0 +1,3 @@
1
+ /* Sheet, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
@@ -0,0 +1,140 @@
1
+ /* SizeProvider and the size scheme, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.sizes {
6
+ /* SizeProvider adds no layout box. Screen-reader semantics belong to its children. */
7
+ .pui-size-scope {
8
+ display: contents;
9
+ }
10
+ [data-ui-size='small'] {
11
+ --ui-slider-track: var(--size-slider-track-small);
12
+ --ui-file-padding: var(--size-file-padding-small);
13
+ --ui-content-gap: var(--size-content-gap-small);
14
+
15
+ --ui-control-height: var(--size-control-height-small);
16
+ --ui-control-padding: var(--size-control-padding-small);
17
+ --ui-button-padding: var(--size-button-padding-small);
18
+ --ui-font: var(--size-font-small);
19
+ --ui-leading: var(--size-leading-small);
20
+ --ui-choice: var(--size-choice-small);
21
+ --ui-switch-width: var(--size-switch-width-small);
22
+ --ui-switch-height: var(--size-switch-height-small);
23
+ --ui-switch-thumb: var(--size-switch-thumb-small);
24
+ --ui-icon: var(--size-icon-small);
25
+ --ui-surface-padding: var(--size-surface-padding-small);
26
+ --ui-card-padding: var(--size-card-padding-small);
27
+ --ui-gap: var(--size-gap-small);
28
+ --ui-row: var(--size-row-small);
29
+ --ui-table-padding-y: var(--size-table-padding-y-small);
30
+ --ui-table-padding-x: var(--size-table-padding-x-small);
31
+ --ui-avatar: var(--size-avatar-small);
32
+ --ui-spinner: var(--size-spinner-small);
33
+ --ui-badge-padding-y: var(--size-badge-padding-y-small);
34
+ --ui-badge-padding-x: var(--size-badge-padding-x-small);
35
+ --ui-badge-font: var(--size-badge-font-small);
36
+ --ui-gauge: var(--size-gauge-small);
37
+ --ui-slider-thumb: var(--size-slider-thumb-small);
38
+ --ui-otp: var(--size-otp-small);
39
+ --ui-tree-row: var(--size-tree-row-small);
40
+ --ui-textarea-padding: var(--size-textarea-padding-small);
41
+ --ui-tooltip-padding-y: var(--size-tooltip-padding-y-small);
42
+ --ui-tooltip-padding-x: var(--size-tooltip-padding-x-small);
43
+ --control-height: var(--ui-control-height);
44
+ --control-padding-x: var(--ui-control-padding);
45
+ --control-choice-size: var(--ui-choice);
46
+ --control-switch-width: var(--ui-switch-width);
47
+ --control-switch-height: var(--ui-switch-height);
48
+ --control-switch-thumb: var(--ui-switch-thumb);
49
+ }
50
+ [data-ui-size='default'] {
51
+ --ui-slider-track: var(--size-slider-track-default);
52
+ --ui-file-padding: var(--size-file-padding-default);
53
+ --ui-content-gap: var(--size-content-gap-default);
54
+
55
+ --ui-control-height: var(--size-control-height-default);
56
+ --ui-control-padding: var(--size-control-padding-default);
57
+ --ui-button-padding: var(--size-button-padding-default);
58
+ --ui-font: var(--size-font-default);
59
+ --ui-leading: var(--size-leading-default);
60
+ --ui-choice: var(--size-choice-default);
61
+ --ui-switch-width: var(--size-switch-width-default);
62
+ --ui-switch-height: var(--size-switch-height-default);
63
+ --ui-switch-thumb: var(--size-switch-thumb-default);
64
+ --ui-icon: var(--size-icon-default);
65
+ --ui-surface-padding: var(--size-surface-padding-default);
66
+ --ui-card-padding: var(--size-card-padding-default);
67
+ --ui-gap: var(--size-gap-default);
68
+ --ui-row: var(--size-row-default);
69
+ --ui-table-padding-y: var(--size-table-padding-y-default);
70
+ --ui-table-padding-x: var(--size-table-padding-x-default);
71
+ --ui-avatar: var(--size-avatar-default);
72
+ --ui-spinner: var(--size-spinner-default);
73
+ --ui-badge-padding-y: var(--size-badge-padding-y-default);
74
+ --ui-badge-padding-x: var(--size-badge-padding-x-default);
75
+ --ui-badge-font: var(--size-badge-font-default);
76
+ --ui-gauge: var(--size-gauge-default);
77
+ --ui-slider-thumb: var(--size-slider-thumb-default);
78
+ --ui-otp: var(--size-otp-default);
79
+ --ui-tree-row: var(--size-tree-row-default);
80
+ --ui-textarea-padding: var(--size-textarea-padding-default);
81
+ --ui-tooltip-padding-y: var(--size-tooltip-padding-y-default);
82
+ --ui-tooltip-padding-x: var(--size-tooltip-padding-x-default);
83
+ --control-height: var(--ui-control-height);
84
+ --control-padding-x: var(--ui-control-padding);
85
+ --control-choice-size: var(--ui-choice);
86
+ --control-switch-width: var(--ui-switch-width);
87
+ --control-switch-height: var(--ui-switch-height);
88
+ --control-switch-thumb: var(--ui-switch-thumb);
89
+ }
90
+ [data-ui-size='large'] {
91
+ --ui-slider-track: var(--size-slider-track-large);
92
+ --ui-file-padding: var(--size-file-padding-large);
93
+ --ui-content-gap: var(--size-content-gap-large);
94
+
95
+ --ui-control-height: var(--size-control-height-large);
96
+ --ui-control-padding: var(--size-control-padding-large);
97
+ --ui-button-padding: var(--size-button-padding-large);
98
+ --ui-font: var(--size-font-large);
99
+ --ui-leading: var(--size-leading-large);
100
+ --ui-choice: var(--size-choice-large);
101
+ --ui-switch-width: var(--size-switch-width-large);
102
+ --ui-switch-height: var(--size-switch-height-large);
103
+ --ui-switch-thumb: var(--size-switch-thumb-large);
104
+ --ui-icon: var(--size-icon-large);
105
+ --ui-surface-padding: var(--size-surface-padding-large);
106
+ --ui-card-padding: var(--size-card-padding-large);
107
+ --ui-gap: var(--size-gap-large);
108
+ --ui-row: var(--size-row-large);
109
+ --ui-table-padding-y: var(--size-table-padding-y-large);
110
+ --ui-table-padding-x: var(--size-table-padding-x-large);
111
+ --ui-avatar: var(--size-avatar-large);
112
+ --ui-spinner: var(--size-spinner-large);
113
+ --ui-badge-padding-y: var(--size-badge-padding-y-large);
114
+ --ui-badge-padding-x: var(--size-badge-padding-x-large);
115
+ --ui-badge-font: var(--size-badge-font-large);
116
+ --ui-gauge: var(--size-gauge-large);
117
+ --ui-slider-thumb: var(--size-slider-thumb-large);
118
+ --ui-otp: var(--size-otp-large);
119
+ --ui-tree-row: var(--size-tree-row-large);
120
+ --ui-textarea-padding: var(--size-textarea-padding-large);
121
+ --ui-tooltip-padding-y: var(--size-tooltip-padding-y-large);
122
+ --ui-tooltip-padding-x: var(--size-tooltip-padding-x-large);
123
+ --control-height: var(--ui-control-height);
124
+ --control-padding-x: var(--ui-control-padding);
125
+ --control-choice-size: var(--ui-choice);
126
+ --control-switch-width: var(--ui-switch-width);
127
+ --control-switch-height: var(--ui-switch-height);
128
+ --control-switch-thumb: var(--ui-switch-thumb);
129
+ }
130
+ /* Coarse pointers retain comfortable targets even with a compact visual scheme. */
131
+ @media (max-width: 760px), (pointer: coarse) {
132
+ [data-ui-size] {
133
+ --control-height: max(
134
+ var(--control-target-size),
135
+ var(--ui-control-height)
136
+ );
137
+ --ui-row: max(var(--control-target-size), var(--ui-control-height));
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,41 @@
1
+ /* Skeleton, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-skeleton {
7
+ display: block;
8
+ min-width: 0;
9
+ width: 100%;
10
+ height: 1em;
11
+ border-radius: var(--radius-sm);
12
+ background: var(--surface);
13
+ animation: pui-progress-pulse 1.4s ease-in-out infinite;
14
+ }
15
+ .pui-skeleton[data-shape='block'] {
16
+ height: 96px;
17
+ border-radius: var(--radius-md);
18
+ }
19
+ .pui-skeleton[data-shape='circle'] {
20
+ width: 36px;
21
+ height: 36px;
22
+ border-radius: 50%;
23
+ flex: none;
24
+ }
25
+ @media (prefers-reduced-motion: reduce) {
26
+ .pui-skeleton {
27
+ animation: none;
28
+ transition: none;
29
+ }
30
+ }
31
+ @media (forced-colors: active) {
32
+ .pui-skeleton {
33
+ background: CanvasText;
34
+ }
35
+ }
36
+ }
37
+ @layer surflane.sizes {
38
+ :where([data-ui-size], [data-ui-size] *).pui-skeleton[data-shape='text'] {
39
+ height: var(--ui-leading);
40
+ }
41
+ }
@@ -0,0 +1,123 @@
1
+ /* Slider, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-slider {
7
+ display: grid;
8
+ grid-template-columns: minmax(0, 1fr) auto;
9
+ column-gap: var(--space-4);
10
+ row-gap: var(--space-2);
11
+ width: 100%;
12
+ max-width: 32rem;
13
+ min-width: 0;
14
+ color: var(--ink-body);
15
+ }
16
+ .pui-slider-label {
17
+ font-weight: var(--weight-regular);
18
+ color: var(--ink);
19
+ overflow-wrap: anywhere;
20
+ }
21
+ .pui-slider-value {
22
+ margin: 0;
23
+ font: inherit;
24
+ font-variant-numeric: tabular-nums;
25
+ text-align: end;
26
+ }
27
+ .pui-slider-control {
28
+ position: relative;
29
+ grid-column: 1/-1;
30
+ display: flex;
31
+ align-items: center;
32
+ width: 100%;
33
+ min-width: 0;
34
+ height: var(--control-target-size);
35
+ touch-action: pan-y;
36
+ user-select: none;
37
+ cursor: pointer;
38
+ }
39
+ .pui-slider-track {
40
+ width: 100%;
41
+ height: 6px;
42
+ border-radius: var(--radius-full);
43
+ background: var(--ink-muted);
44
+ }
45
+ .pui-slider-indicator {
46
+ background: var(--brand);
47
+ border-radius: inherit;
48
+ }
49
+ .pui-slider-thumb {
50
+ box-sizing: border-box;
51
+ width: 24px;
52
+ height: 24px;
53
+ border: 2px solid var(--ink-body);
54
+ border-radius: var(--radius-full);
55
+ background: var(--canvas);
56
+ }
57
+ .pui-slider-thumb:focus-within {
58
+ outline: var(--focus-ring-width) solid var(--interaction-focus);
59
+ outline-offset: var(--focus-ring-offset);
60
+ }
61
+ .pui-slider[data-disabled] {
62
+ opacity: var(--control-disabled-opacity);
63
+ }
64
+ .pui-slider-control[data-disabled],
65
+ .pui-slider-thumb[data-disabled] {
66
+ cursor: not-allowed;
67
+ }
68
+ .pui-slider[data-orientation='vertical'] {
69
+ width: max-content;
70
+ min-width: 120px;
71
+ }
72
+ .pui-slider-control[data-orientation='vertical'] {
73
+ width: var(--control-target-size);
74
+ height: 192px;
75
+ justify-content: center;
76
+ justify-self: center;
77
+ touch-action: pan-x;
78
+ }
79
+ .pui-slider-track[data-orientation='vertical'] {
80
+ width: 6px;
81
+ height: 100%;
82
+ }
83
+ @media (max-width: 760px) {
84
+ .pui-slider-thumb {
85
+ width: 28px;
86
+ height: 28px;
87
+ }
88
+ }
89
+ @media (forced-colors: active) {
90
+ .pui-slider-track {
91
+ background: CanvasText;
92
+ }
93
+ .pui-slider-indicator {
94
+ background: Highlight;
95
+ }
96
+ .pui-slider-thumb {
97
+ border-color: CanvasText;
98
+ background: Canvas;
99
+ }
100
+ }
101
+ }
102
+ @layer surflane.sizes {
103
+ :where([data-ui-size], [data-ui-size] *).pui-slider-thumb {
104
+ width: var(--ui-slider-thumb);
105
+ height: var(--ui-slider-thumb);
106
+ }
107
+ @media (max-width: 760px), (pointer: coarse) {
108
+ :where([data-ui-size], [data-ui-size] *).pui-slider-control {
109
+ min-block-size: var(--control-target-size);
110
+ }
111
+ }
112
+ :where([data-ui-size], [data-ui-size] *).pui-slider-track:not(
113
+ [data-orientation='vertical']
114
+ ) {
115
+ height: var(--ui-gauge);
116
+ }
117
+ :where(
118
+ [data-ui-size],
119
+ [data-ui-size] *
120
+ ).pui-slider-track[data-orientation='vertical'] {
121
+ width: var(--ui-slider-track);
122
+ }
123
+ }
@@ -0,0 +1,52 @@
1
+ /* Sparkline, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ /* The line fills the width it is given; its height comes from the size. */
7
+ .pui-sparkline {
8
+ --sparkline-height: var(--space-8);
9
+ display: block;
10
+ inline-size: 100%;
11
+ block-size: var(--sparkline-height);
12
+ overflow: visible;
13
+ color: var(--ink-body);
14
+ fill: none;
15
+ }
16
+ .pui-sparkline[data-size='small'] {
17
+ --sparkline-height: var(--space-6);
18
+ }
19
+ .pui-sparkline[data-size='large'] {
20
+ --sparkline-height: var(--space-12);
21
+ }
22
+ .pui-sparkline[data-tone='up'] {
23
+ color: var(--trend-up-fg);
24
+ }
25
+ .pui-sparkline[data-tone='down'] {
26
+ color: var(--trend-down-fg);
27
+ }
28
+ .pui-sparkline[data-tone='flat'] {
29
+ color: var(--trend-flat-fg);
30
+ }
31
+ .pui-sparkline-line {
32
+ stroke: currentColor;
33
+ stroke-width: var(--icon-stroke-width);
34
+ stroke-linejoin: round;
35
+ stroke-linecap: round;
36
+ }
37
+ .pui-sparkline-baseline {
38
+ stroke: var(--ink-muted);
39
+ stroke-width: 1;
40
+ stroke-dasharray: 2 3;
41
+ }
42
+ .pui-sparkline-marker {
43
+ stroke: currentColor;
44
+ stroke-width: calc(var(--icon-stroke-width) * 3);
45
+ stroke-linecap: round;
46
+ }
47
+ @media (forced-colors: active) {
48
+ .pui-sparkline {
49
+ color: CanvasText;
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,38 @@
1
+ /* Spinner, with the styles of what it renders. */
2
+ @layer surflane.tokens, surflane.themes, surflane.base, surflane.components,
3
+ surflane.sizes;
4
+
5
+ @layer surflane.components {
6
+ .pui-spinner {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ flex: none;
11
+ color: var(--ink-body);
12
+ width: 20px;
13
+ height: 20px;
14
+ vertical-align: middle;
15
+ }
16
+ .pui-spinner > svg {
17
+ width: 100%;
18
+ height: 100%;
19
+ animation: pui-feedback-spin 1s linear infinite;
20
+ }
21
+ @keyframes pui-feedback-spin {
22
+ to {
23
+ transform: rotate(360deg);
24
+ }
25
+ }
26
+ @media (prefers-reduced-motion: reduce) {
27
+ .pui-spinner > svg {
28
+ animation: none;
29
+ transition: none;
30
+ }
31
+ }
32
+ }
33
+ @layer surflane.sizes {
34
+ :where([data-ui-size], [data-ui-size] *).pui-spinner {
35
+ width: var(--ui-spinner);
36
+ height: var(--ui-spinner);
37
+ }
38
+ }