@ptbdynamic/plinth 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +258 -2
  3. package/package.json +99 -4
  4. package/packages/css/dist/avatar.css +122 -0
  5. package/packages/css/dist/badge.css +76 -0
  6. package/packages/css/dist/button.css +273 -0
  7. package/packages/css/dist/callout.css +143 -0
  8. package/packages/css/dist/code-block.css +283 -0
  9. package/packages/css/dist/confirm-dialog.css +183 -0
  10. package/packages/css/dist/data-table.css +470 -0
  11. package/packages/css/dist/dialog.css +113 -0
  12. package/packages/css/dist/drawer.css +156 -0
  13. package/packages/css/dist/fonts/geist/LICENSE +93 -0
  14. package/packages/css/dist/fonts/geist/geist-cyrillic-ext-wght-normal.woff2 +0 -0
  15. package/packages/css/dist/fonts/geist/geist-cyrillic-wght-normal.woff2 +0 -0
  16. package/packages/css/dist/fonts/geist/geist-latin-ext-wght-normal.woff2 +0 -0
  17. package/packages/css/dist/fonts/geist/geist-latin-wght-normal.woff2 +0 -0
  18. package/packages/css/dist/fonts/geist/geist-vietnamese-wght-normal.woff2 +0 -0
  19. package/packages/css/dist/fonts/geist-mono/LICENSE +93 -0
  20. package/packages/css/dist/fonts/geist-mono/geist-mono-cyrillic-ext-wght-normal.woff2 +0 -0
  21. package/packages/css/dist/fonts/geist-mono/geist-mono-cyrillic-wght-normal.woff2 +0 -0
  22. package/packages/css/dist/fonts/geist-mono/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  23. package/packages/css/dist/fonts/geist-mono/geist-mono-latin-wght-normal.woff2 +0 -0
  24. package/packages/css/dist/fonts/geist-mono/geist-mono-symbols2-wght-normal.woff2 +0 -0
  25. package/packages/css/dist/fonts/geist-mono/geist-mono-vietnamese-wght-normal.woff2 +0 -0
  26. package/packages/css/dist/fonts/index.css +109 -0
  27. package/packages/css/dist/header.css +110 -0
  28. package/packages/css/dist/icon.css +51 -0
  29. package/packages/css/dist/list-card.css +76 -0
  30. package/packages/css/dist/list-row.css +164 -0
  31. package/packages/css/dist/menu-sheet.css +84 -0
  32. package/packages/css/dist/menu.css +245 -0
  33. package/packages/css/dist/modal.css +367 -0
  34. package/packages/css/dist/page-header.css +124 -0
  35. package/packages/css/dist/pill-row.css +197 -0
  36. package/packages/css/dist/plinth.css +4446 -0
  37. package/packages/css/dist/section-menu.css +226 -0
  38. package/packages/css/dist/sheet.css +239 -0
  39. package/packages/css/dist/text-field.css +230 -0
  40. package/packages/css/dist/textarea.css +169 -0
  41. package/packages/css/dist/tokens.css +413 -0
  42. package/packages/react/dist/PlinthAvatar.d.ts +17 -0
  43. package/packages/react/dist/PlinthBadge.d.ts +7 -0
  44. package/packages/react/dist/PlinthButton.d.ts +29 -0
  45. package/packages/react/dist/PlinthCallout.d.ts +16 -0
  46. package/packages/react/dist/PlinthCodeBlock.d.ts +24 -0
  47. package/packages/react/dist/PlinthConfirmDialog.d.ts +38 -0
  48. package/packages/react/dist/PlinthDataTable.d.ts +11 -0
  49. package/packages/react/dist/PlinthDataTableCell.d.ts +15 -0
  50. package/packages/react/dist/PlinthDataTableColumn.d.ts +13 -0
  51. package/packages/react/dist/PlinthDataTableEmpty.d.ts +9 -0
  52. package/packages/react/dist/PlinthDataTableRow.d.ts +9 -0
  53. package/packages/react/dist/PlinthDataTableSort.d.ts +4 -0
  54. package/packages/react/dist/PlinthDialog.d.ts +26 -0
  55. package/packages/react/dist/PlinthDrawer.d.ts +29 -0
  56. package/packages/react/dist/PlinthIcon.d.ts +10 -0
  57. package/packages/react/dist/PlinthIconButton.d.ts +26 -0
  58. package/packages/react/dist/PlinthListCard.d.ts +14 -0
  59. package/packages/react/dist/PlinthListRow.d.ts +29 -0
  60. package/packages/react/dist/PlinthMenu.d.ts +12 -0
  61. package/packages/react/dist/PlinthMenuGroup.d.ts +9 -0
  62. package/packages/react/dist/PlinthMenuItem.d.ts +26 -0
  63. package/packages/react/dist/PlinthMenuSeparator.d.ts +4 -0
  64. package/packages/react/dist/PlinthMenuSheet.d.ts +24 -0
  65. package/packages/react/dist/PlinthPageHeader.d.ts +17 -0
  66. package/packages/react/dist/PlinthPill.d.ts +17 -0
  67. package/packages/react/dist/PlinthPillRow.d.ts +13 -0
  68. package/packages/react/dist/PlinthSectionMenu.d.ts +11 -0
  69. package/packages/react/dist/PlinthSectionMenuItem.d.ts +20 -0
  70. package/packages/react/dist/PlinthSheet.d.ts +26 -0
  71. package/packages/react/dist/PlinthTextField.d.ts +24 -0
  72. package/packages/react/dist/PlinthTextarea.d.ts +24 -0
  73. package/packages/react/dist/avatar.d.ts +12 -0
  74. package/packages/react/dist/button.d.ts +21 -0
  75. package/packages/react/dist/callout.d.ts +19 -0
  76. package/packages/react/dist/code-block.d.ts +16 -0
  77. package/packages/react/dist/confirm-dialog.d.ts +23 -0
  78. package/packages/react/dist/data-table.d.ts +15 -0
  79. package/packages/react/dist/dialog.d.ts +10 -0
  80. package/packages/react/dist/drawer.d.ts +20 -0
  81. package/packages/react/dist/heading.d.ts +5 -0
  82. package/packages/react/dist/icon.d.ts +5 -0
  83. package/packages/react/dist/index.d.ts +49 -0
  84. package/packages/react/dist/index.js +1326 -0
  85. package/packages/react/dist/list-row.d.ts +5 -0
  86. package/packages/react/dist/markup.d.ts +9 -0
  87. package/packages/react/dist/menu.d.ts +7 -0
  88. package/packages/react/dist/page-header.d.ts +5 -0
  89. package/packages/react/dist/sheet.d.ts +12 -0
  90. package/packages/react/dist/size.d.ts +13 -0
  91. package/packages/react/dist/swipe.d.ts +15 -0
  92. package/packages/react/dist/text-field.d.ts +10 -0
  93. package/packages/react/dist/tones.d.ts +5 -0
  94. package/packages/tokens/dist/index.d.ts +230 -0
  95. package/packages/tokens/dist/index.js +4091 -0
  96. package/packages/tokens/dist/tailwind-theme.css +80 -0
  97. package/packages/tokens/dist/tokens.css +413 -0
  98. package/packages/tokens/dist/tokens.json +3875 -0
  99. package/packages/vue/dist/PlinthAvatar.vue.d.ts +24 -0
  100. package/packages/vue/dist/PlinthBadge.vue.d.ts +21 -0
  101. package/packages/vue/dist/PlinthButton.vue.d.ts +42 -0
  102. package/packages/vue/dist/PlinthCallout.vue.d.ts +31 -0
  103. package/packages/vue/dist/PlinthCodeBlock.vue.d.ts +49 -0
  104. package/packages/vue/dist/PlinthConfirmDialog.vue.d.ts +51 -0
  105. package/packages/vue/dist/PlinthDataTable.vue.d.ts +21 -0
  106. package/packages/vue/dist/PlinthDataTableCell.vue.d.ts +29 -0
  107. package/packages/vue/dist/PlinthDataTableColumn.vue.d.ts +26 -0
  108. package/packages/vue/dist/PlinthDataTableEmpty.vue.d.ts +19 -0
  109. package/packages/vue/dist/PlinthDataTableRow.vue.d.ts +19 -0
  110. package/packages/vue/dist/PlinthDataTableSort.vue.d.ts +13 -0
  111. package/packages/vue/dist/PlinthDialog.vue.d.ts +45 -0
  112. package/packages/vue/dist/PlinthDrawer.vue.d.ts +48 -0
  113. package/packages/vue/dist/PlinthIcon.vue.d.ts +23 -0
  114. package/packages/vue/dist/PlinthIconButton.vue.d.ts +37 -0
  115. package/packages/vue/dist/PlinthListCard.vue.d.ts +26 -0
  116. package/packages/vue/dist/PlinthListRow.vue.d.ts +38 -0
  117. package/packages/vue/dist/PlinthMenu.vue.d.ts +24 -0
  118. package/packages/vue/dist/PlinthMenuGroup.vue.d.ts +17 -0
  119. package/packages/vue/dist/PlinthMenuItem.vue.d.ts +34 -0
  120. package/packages/vue/dist/PlinthMenuSeparator.vue.d.ts +3 -0
  121. package/packages/vue/dist/PlinthMenuSheet.vue.d.ts +48 -0
  122. package/packages/vue/dist/PlinthPageHeader.vue.d.ts +27 -0
  123. package/packages/vue/dist/PlinthPill.vue.d.ts +28 -0
  124. package/packages/vue/dist/PlinthPillRow.vue.d.ts +22 -0
  125. package/packages/vue/dist/PlinthSectionMenu.vue.d.ts +22 -0
  126. package/packages/vue/dist/PlinthSectionMenuItem.vue.d.ts +28 -0
  127. package/packages/vue/dist/PlinthSheet.vue.d.ts +45 -0
  128. package/packages/vue/dist/PlinthTextField.vue.d.ts +51 -0
  129. package/packages/vue/dist/PlinthTextarea.vue.d.ts +42 -0
  130. package/packages/vue/dist/avatar.d.ts +12 -0
  131. package/packages/vue/dist/button.d.ts +5 -0
  132. package/packages/vue/dist/callout.d.ts +19 -0
  133. package/packages/vue/dist/code-block.d.ts +16 -0
  134. package/packages/vue/dist/confirm-dialog.d.ts +23 -0
  135. package/packages/vue/dist/data-table.d.ts +15 -0
  136. package/packages/vue/dist/dialog.d.ts +10 -0
  137. package/packages/vue/dist/drawer.d.ts +20 -0
  138. package/packages/vue/dist/heading.d.ts +5 -0
  139. package/packages/vue/dist/icon.d.ts +5 -0
  140. package/packages/vue/dist/index.d.ts +53 -0
  141. package/packages/vue/dist/index.js +1732 -0
  142. package/packages/vue/dist/list-row.d.ts +5 -0
  143. package/packages/vue/dist/menu.d.ts +8 -0
  144. package/packages/vue/dist/page-header.d.ts +5 -0
  145. package/packages/vue/dist/sheet.d.ts +12 -0
  146. package/packages/vue/dist/size.d.ts +13 -0
  147. package/packages/vue/dist/slots.d.ts +3 -0
  148. package/packages/vue/dist/swipe.d.ts +12 -0
  149. package/packages/vue/dist/text-field.d.ts +10 -0
  150. package/packages/vue/dist/tones.d.ts +5 -0
@@ -0,0 +1,169 @@
1
+ /*
2
+ * Textarea: several lines of text, with its label, an optional description and an error. With
3
+ * grow, it grows with its content.
4
+ *
5
+ * <div class="plinth-textarea">
6
+ * <label class="plinth-textarea-label" for="reply">Reply</label>
7
+ * <textarea class="plinth-textarea-input" id="reply" rows="3"
8
+ * aria-describedby="reply-description reply-error" aria-invalid="true"></textarea>
9
+ * <p class="plinth-textarea-description" id="reply-description">The customer sees it.</p>
10
+ * <p class="plinth-textarea-error" id="reply-error">Write a reply first.</p>
11
+ * </div>
12
+ *
13
+ * The textarea needs an id: the label points at it with for, and the description's and error's
14
+ * ids are the textarea's id with -description and -error. The description and the error are
15
+ * optional; aria-describedby lists the description, then the error, and is left out when there is
16
+ * neither. rows is 3 by default.
17
+ *
18
+ * Attributes go to the textarea, not the root (name, placeholder, maxlength, required,
19
+ * wire:model, x-model, data-*, aria-*), so the app talks to the textarea; only a project's class
20
+ * is added to the root's.
21
+ *
22
+ * - grow: data-grow on the textarea, with its rows and maximum as custom properties:
23
+ * <textarea class="plinth-textarea-input" id="reply" rows="3" data-grow
24
+ * style="--plinth-textarea-rows: 3; --plinth-textarea-max-rows: 8"></textarea>
25
+ * It starts at rows lines and grows with its content (field-sizing: content) up to max-rows
26
+ * (8 by default), then scrolls. Where the browser has no field-sizing it keeps rows lines and
27
+ * the person can resize it, as without grow.
28
+ * - data-label="hidden" on the root hides the label visually; screen readers still read it. Use it
29
+ * only where the field's purpose is plain without it, such as a reply box under a thread.
30
+ *
31
+ * The text is 16px on a phone, so iOS doesn't zoom into the field, and 14px from 768px up.
32
+ *
33
+ * States:
34
+ * - error: aria-invalid="true" on the textarea and the error message under it; the edge turns
35
+ * danger and thick, so it isn't only a colour, and the message says what to fix.
36
+ * - disabled: `disabled` on the textarea; the field is faded and can't be focused.
37
+ * - read-only: `readonly` on the textarea; it keeps its text and focus, without the field's fill
38
+ * and with a dashed edge.
39
+ * - the focus ring on the textarea's :focus-visible.
40
+ */
41
+
42
+ @layer plinth {
43
+ .plinth-textarea {
44
+ display: grid;
45
+ gap: var(--plinth-space-2);
46
+ min-inline-size: 0;
47
+ font-family: var(--plinth-font-family-body);
48
+ }
49
+
50
+ .plinth-textarea-label {
51
+ font-size: var(--plinth-font-size-sm);
52
+ font-weight: var(--plinth-font-weight-medium);
53
+ line-height: var(--plinth-font-leading-normal);
54
+ color: var(--plinth-color-text-muted);
55
+ overflow-wrap: anywhere;
56
+ }
57
+
58
+ /* Hidden from sight, still read by screen readers. */
59
+ .plinth-textarea[data-label='hidden'] .plinth-textarea-label {
60
+ position: absolute;
61
+ inline-size: 1px;
62
+ block-size: 1px;
63
+ overflow: hidden;
64
+ white-space: nowrap;
65
+ clip-path: inset(50%);
66
+ }
67
+
68
+ .plinth-textarea-input {
69
+ box-sizing: border-box;
70
+ inline-size: 100%;
71
+ min-block-size: var(--plinth-touch-target);
72
+ padding-block: var(--plinth-space-2);
73
+ padding-inline: var(--plinth-space-3);
74
+ margin: 0;
75
+ font-family: inherit;
76
+ font-size: var(--plinth-font-size-field);
77
+ line-height: var(--plinth-font-leading-normal);
78
+ color: var(--plinth-color-text);
79
+ resize: vertical;
80
+ background-color: var(--plinth-color-surface-sunken);
81
+ border: var(--plinth-border-width-thin) solid var(--plinth-color-border-strong);
82
+ border-radius: var(--plinth-radius-control);
83
+ transition: border-color var(--plinth-duration-fast) var(--plinth-easing-standard);
84
+ }
85
+
86
+ .plinth-textarea-input::placeholder {
87
+ color: var(--plinth-color-text-subtle);
88
+ opacity: 1;
89
+ }
90
+
91
+ @media (hover: hover) {
92
+ .plinth-textarea-input:hover:not(:disabled, :read-only, [aria-invalid='true']) {
93
+ border-color: var(--plinth-color-text-subtle);
94
+ }
95
+ }
96
+
97
+ .plinth-textarea-input:focus-visible {
98
+ outline: var(--plinth-focus-ring-width) solid var(--plinth-color-focus-ring);
99
+ outline-offset: var(--plinth-focus-ring-offset);
100
+ }
101
+
102
+ .plinth-textarea-input[aria-invalid='true'] {
103
+ border-color: var(--plinth-color-danger);
104
+ border-width: var(--plinth-border-width-thick);
105
+ }
106
+
107
+ .plinth-textarea-input:disabled {
108
+ cursor: not-allowed;
109
+ resize: none;
110
+ opacity: var(--plinth-opacity-disabled);
111
+ }
112
+
113
+ /* Without the fill, and with a dashed edge, so it doesn't read as a field to type in. */
114
+ .plinth-textarea-input:read-only:not(:disabled) {
115
+ background-color: transparent;
116
+ border-style: dashed;
117
+ }
118
+
119
+ /*
120
+ * Grow: from rows lines to max-rows lines (in the textarea's own line height, with its padding
121
+ * and edge), then it scrolls.
122
+ */
123
+ @supports (field-sizing: content) {
124
+ .plinth-textarea-input[data-grow] {
125
+ field-sizing: content;
126
+ min-block-size: max(
127
+ var(--plinth-touch-target),
128
+ calc(
129
+ var(--plinth-textarea-rows, 3) * 1lh + 2 * var(--plinth-space-2) + 2 *
130
+ var(--plinth-border-width-thin)
131
+ )
132
+ );
133
+ max-block-size: calc(
134
+ var(--plinth-textarea-max-rows, 8) * 1lh + 2 * var(--plinth-space-2) + 2 *
135
+ var(--plinth-border-width-thin)
136
+ );
137
+ resize: none;
138
+ }
139
+ }
140
+
141
+ .plinth-textarea-description,
142
+ .plinth-textarea-error {
143
+ margin: 0;
144
+ font-size: var(--plinth-font-size-sm);
145
+ line-height: var(--plinth-font-leading-normal);
146
+ overflow-wrap: anywhere;
147
+ }
148
+
149
+ .plinth-textarea-description {
150
+ color: var(--plinth-color-text-muted);
151
+ }
152
+
153
+ .plinth-textarea-error {
154
+ color: var(--plinth-color-danger-text);
155
+ }
156
+
157
+ @media (min-width: 768px) {
158
+ .plinth-textarea-input {
159
+ font-size: var(--plinth-font-size-md);
160
+ }
161
+ }
162
+
163
+ @media (forced-colors: active) {
164
+ .plinth-textarea-input:disabled {
165
+ color: GrayText;
166
+ border-color: GrayText;
167
+ }
168
+ }
169
+ }
@@ -0,0 +1,413 @@
1
+ /* Built from packages/tokens/tokens/*.json. Do not edit by hand. */
2
+
3
+ @layer plinth {
4
+ :root {
5
+ --plinth-ref-color-neutral-0: oklch(1 0 0);
6
+ --plinth-ref-color-neutral-50: oklch(0.985 0.002 260);
7
+ --plinth-ref-color-neutral-100: oklch(0.965 0.003 260);
8
+ --plinth-ref-color-neutral-150: oklch(0.945 0.004 260);
9
+ --plinth-ref-color-neutral-200: oklch(0.92 0.004 260);
10
+ --plinth-ref-color-neutral-300: oklch(0.82 0.005 260);
11
+ --plinth-ref-color-neutral-400: oklch(0.71 0.008 260);
12
+ --plinth-ref-color-neutral-500: oklch(0.54 0.01 260);
13
+ --plinth-ref-color-neutral-600: oklch(0.45 0.01 260);
14
+ --plinth-ref-color-neutral-700: oklch(0.37 0.01 260);
15
+ --plinth-ref-color-neutral-800: oklch(0.27 0.008 260);
16
+ --plinth-ref-color-neutral-850: oklch(0.235 0.007 260);
17
+ --plinth-ref-color-neutral-900: oklch(0.205 0.006 260);
18
+ --plinth-ref-color-neutral-950: oklch(0.18 0.005 260);
19
+ --plinth-ref-color-neutral-1000: oklch(0.145 0.004 260);
20
+ --plinth-ref-color-brand-50: #eff6ff;
21
+ --plinth-ref-color-brand-100: #dbeafe;
22
+ --plinth-ref-color-brand-200: #bfdbfe;
23
+ --plinth-ref-color-brand-300: #93c5fd;
24
+ --plinth-ref-color-brand-400: #60a5fa;
25
+ --plinth-ref-color-brand-500: #3b82f6;
26
+ --plinth-ref-color-brand-600: #2563eb;
27
+ --plinth-ref-color-brand-700: #1d4ed8;
28
+ --plinth-ref-color-brand-800: #1e40af;
29
+ --plinth-ref-color-brand-900: #1e3a8a;
30
+ --plinth-ref-color-brand-950: #172554;
31
+ --plinth-ref-color-green-50: #f0fdf4;
32
+ --plinth-ref-color-green-100: #dcfce7;
33
+ --plinth-ref-color-green-200: #bbf7d0;
34
+ --plinth-ref-color-green-400: #4ade80;
35
+ --plinth-ref-color-green-600: #16a34a;
36
+ --plinth-ref-color-green-700: #15803d;
37
+ --plinth-ref-color-green-800: #166534;
38
+ --plinth-ref-color-green-950: #052e16;
39
+ --plinth-ref-color-amber-50: #fffbeb;
40
+ --plinth-ref-color-amber-100: #fef3c7;
41
+ --plinth-ref-color-amber-200: #fde68a;
42
+ --plinth-ref-color-amber-400: #fbbf24;
43
+ --plinth-ref-color-amber-500: #f59e0b;
44
+ --plinth-ref-color-amber-700: #b45309;
45
+ --plinth-ref-color-amber-800: #92400e;
46
+ --plinth-ref-color-amber-950: #451a03;
47
+ --plinth-ref-color-red-50: #fef2f2;
48
+ --plinth-ref-color-red-100: #fee2e2;
49
+ --plinth-ref-color-red-200: #fecaca;
50
+ --plinth-ref-color-red-400: #f87171;
51
+ --plinth-ref-color-red-600: #dc2626;
52
+ --plinth-ref-color-red-700: #b91c1c;
53
+ --plinth-ref-color-red-800: #991b1b;
54
+ --plinth-ref-color-red-950: #450a0a;
55
+ --plinth-ref-color-black-alpha-10: #0000001a;
56
+ --plinth-ref-color-black-alpha-15: #00000026;
57
+ --plinth-ref-color-black-alpha-30: #0000004d;
58
+ --plinth-ref-color-black-alpha-50: #00000080;
59
+ --plinth-ref-color-black-alpha-60: #00000099;
60
+ --plinth-ref-color-black-alpha-70: #000000b3;
61
+ --plinth-ref-color-ink-alpha-6: oklch(0.18 0.005 260 / 0.06);
62
+ --plinth-ref-color-ink-alpha-10: oklch(0.18 0.005 260 / 0.1);
63
+ --plinth-ref-color-ink-alpha-20: oklch(0.18 0.005 260 / 0.2);
64
+ --plinth-ref-color-chalk-alpha-6: oklch(0.965 0.003 260 / 0.06);
65
+ --plinth-ref-color-chalk-alpha-10: oklch(0.965 0.003 260 / 0.1);
66
+ --plinth-ref-color-chalk-alpha-20: oklch(0.965 0.003 260 / 0.2);
67
+ --plinth-ref-color-white-alpha-12: #ffffff1f;
68
+ --plinth-ref-space-0: 0;
69
+ --plinth-ref-space-1: 0.25rem;
70
+ --plinth-ref-space-2: 0.5rem;
71
+ --plinth-ref-space-3: 0.75rem;
72
+ --plinth-ref-space-4: 1rem;
73
+ --plinth-ref-space-5: 1.25rem;
74
+ --plinth-ref-space-6: 1.5rem;
75
+ --plinth-ref-space-8: 2rem;
76
+ --plinth-ref-space-10: 2.5rem;
77
+ --plinth-ref-space-12: 3rem;
78
+ --plinth-ref-space-14: 3.5rem;
79
+ --plinth-ref-space-16: 4rem;
80
+ --plinth-ref-space-0-5: 0.125rem;
81
+ --plinth-ref-size-16: 1rem;
82
+ --plinth-ref-size-20: 1.25rem;
83
+ --plinth-ref-size-24: 1.5rem;
84
+ --plinth-ref-size-28: 1.75rem;
85
+ --plinth-ref-size-32: 2rem;
86
+ --plinth-ref-size-40: 2.5rem;
87
+ --plinth-ref-size-44: 2.75rem;
88
+ --plinth-ref-size-56: 3.5rem;
89
+ --plinth-ref-size-160: 10rem;
90
+ --plinth-ref-size-192: 12rem;
91
+ --plinth-ref-size-320: 20rem;
92
+ --plinth-ref-size-400: 25rem;
93
+ --plinth-ref-size-480: 30rem;
94
+ --plinth-ref-radius-0: 0;
95
+ --plinth-ref-radius-2: 0.125rem;
96
+ --plinth-ref-radius-4: 0.25rem;
97
+ --plinth-ref-radius-6: 0.375rem;
98
+ --plinth-ref-radius-8: 0.5rem;
99
+ --plinth-ref-radius-10: 0.625rem;
100
+ --plinth-ref-radius-12: 0.75rem;
101
+ --plinth-ref-radius-16: 1rem;
102
+ --plinth-ref-radius-full: 9999px;
103
+ --plinth-ref-border-width-1: 1px;
104
+ --plinth-ref-border-width-2: 2px;
105
+ --plinth-ref-border-width-3: 3px;
106
+ --plinth-ref-font-family-sans: 'Geist Variable', Geist, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
107
+ --plinth-ref-font-family-mono: 'Geist Mono Variable', 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace;
108
+ --plinth-ref-font-size-12: 0.75rem;
109
+ --plinth-ref-font-size-13: 0.8125rem;
110
+ --plinth-ref-font-size-14: 0.875rem;
111
+ --plinth-ref-font-size-15: 0.9375rem;
112
+ --plinth-ref-font-size-16: 1rem;
113
+ --plinth-ref-font-size-18: 1.125rem;
114
+ --plinth-ref-font-size-24: 1.5rem;
115
+ --plinth-ref-font-size-30: 1.875rem;
116
+ --plinth-ref-font-size-36: 2.25rem;
117
+ --plinth-ref-font-size-48: 3rem;
118
+ --plinth-ref-font-size-64: 4rem;
119
+ --plinth-ref-font-weight-400: 400;
120
+ --plinth-ref-font-weight-500: 500;
121
+ --plinth-ref-font-weight-600: 600;
122
+ --plinth-ref-font-weight-700: 700;
123
+ --plinth-ref-font-leading-105: 1.05;
124
+ --plinth-ref-font-leading-125: 1.25;
125
+ --plinth-ref-font-leading-150: 1.5;
126
+ --plinth-ref-font-tracking-0: 0;
127
+ --plinth-ref-font-tracking-neg-1: -0.01em;
128
+ --plinth-ref-font-tracking-neg-2: -0.02em;
129
+ --plinth-ref-font-tracking-neg-4: -0.04em;
130
+ --plinth-ref-duration-120: 120ms;
131
+ --plinth-ref-duration-200: 200ms;
132
+ --plinth-ref-duration-320: 320ms;
133
+ --plinth-ref-easing-standard: cubic-bezier(0.2, 0, 0, 1);
134
+ --plinth-ref-easing-enter: cubic-bezier(0, 0, 0, 1);
135
+ --plinth-ref-easing-exit: cubic-bezier(0.3, 0, 1, 1);
136
+ --plinth-space-0: var(--plinth-ref-space-0);
137
+ --plinth-space-1: var(--plinth-ref-space-1);
138
+ --plinth-space-2: var(--plinth-ref-space-2);
139
+ --plinth-space-3: var(--plinth-ref-space-3);
140
+ --plinth-space-4: var(--plinth-ref-space-4);
141
+ --plinth-space-5: var(--plinth-ref-space-5);
142
+ --plinth-space-6: var(--plinth-ref-space-6);
143
+ --plinth-space-8: var(--plinth-ref-space-8);
144
+ --plinth-space-10: var(--plinth-ref-space-10);
145
+ --plinth-space-12: var(--plinth-ref-space-12);
146
+ --plinth-space-14: var(--plinth-ref-space-14);
147
+ --plinth-space-16: var(--plinth-ref-space-16);
148
+ --plinth-space-0-5: var(--plinth-ref-space-0-5);
149
+ --plinth-radius-control: var(--plinth-ref-radius-6);
150
+ --plinth-radius-container: var(--plinth-ref-radius-10);
151
+ --plinth-radius-pill: var(--plinth-ref-radius-full);
152
+ --plinth-border-width-thin: var(--plinth-ref-border-width-1);
153
+ --plinth-border-width-thick: var(--plinth-ref-border-width-2);
154
+ --plinth-opacity-disabled: 0.5;
155
+ --plinth-focus-ring-width: var(--plinth-ref-border-width-2);
156
+ --plinth-focus-ring-offset: 0;
157
+ --plinth-focus-ring-offset-filled: var(--plinth-ref-border-width-2);
158
+ --plinth-focus-ring-offset-inset: -2px;
159
+ --plinth-font-family-body: var(--plinth-ref-font-family-sans);
160
+ --plinth-font-family-mono: var(--plinth-ref-font-family-mono);
161
+ --plinth-font-size-xs: var(--plinth-ref-font-size-12);
162
+ --plinth-font-size-sm: var(--plinth-ref-font-size-13);
163
+ --plinth-font-size-md: var(--plinth-ref-font-size-14);
164
+ --plinth-font-size-lg: var(--plinth-ref-font-size-15);
165
+ --plinth-font-size-xl: var(--plinth-ref-font-size-18);
166
+ --plinth-font-size-2xl: var(--plinth-ref-font-size-24);
167
+ --plinth-font-size-3xl: var(--plinth-ref-font-size-30);
168
+ --plinth-font-size-4xl: var(--plinth-ref-font-size-36);
169
+ --plinth-font-size-5xl: var(--plinth-ref-font-size-48);
170
+ --plinth-font-size-6xl: var(--plinth-ref-font-size-64);
171
+ --plinth-font-size-field: var(--plinth-ref-font-size-16);
172
+ --plinth-font-weight-regular: var(--plinth-ref-font-weight-400);
173
+ --plinth-font-weight-medium: var(--plinth-ref-font-weight-500);
174
+ --plinth-font-weight-semibold: var(--plinth-ref-font-weight-600);
175
+ --plinth-font-weight-bold: var(--plinth-ref-font-weight-700);
176
+ --plinth-font-leading-display: var(--plinth-ref-font-leading-105);
177
+ --plinth-font-leading-tight: var(--plinth-ref-font-leading-125);
178
+ --plinth-font-leading-normal: var(--plinth-ref-font-leading-150);
179
+ --plinth-font-tracking-normal: var(--plinth-ref-font-tracking-0);
180
+ --plinth-font-tracking-snug: var(--plinth-ref-font-tracking-neg-1);
181
+ --plinth-font-tracking-tight: var(--plinth-ref-font-tracking-neg-2);
182
+ --plinth-font-tracking-tighter: var(--plinth-ref-font-tracking-neg-4);
183
+ --plinth-duration-fast: var(--plinth-ref-duration-120);
184
+ --plinth-duration-normal: var(--plinth-ref-duration-200);
185
+ --plinth-duration-slow: var(--plinth-ref-duration-320);
186
+ --plinth-easing-standard: var(--plinth-ref-easing-standard);
187
+ --plinth-easing-enter: var(--plinth-ref-easing-enter);
188
+ --plinth-easing-exit: var(--plinth-ref-easing-exit);
189
+ --plinth-control-sm: var(--plinth-ref-size-28);
190
+ --plinth-control-md: var(--plinth-ref-size-32);
191
+ --plinth-control-lg: var(--plinth-ref-size-40);
192
+ --plinth-touch-target: var(--plinth-ref-size-40);
193
+ --plinth-size-icon-sm: var(--plinth-ref-size-16);
194
+ --plinth-size-icon-md: var(--plinth-ref-size-20);
195
+ --plinth-size-icon-lg: var(--plinth-ref-size-24);
196
+ --plinth-size-row: var(--plinth-ref-size-44);
197
+ --plinth-size-avatar-sm: var(--plinth-ref-size-24);
198
+ --plinth-size-avatar-md: var(--plinth-ref-size-32);
199
+ --plinth-size-avatar-lg: var(--plinth-ref-size-40);
200
+ --plinth-size-avatar-xl: var(--plinth-ref-size-56);
201
+ --plinth-size-dialog: var(--plinth-ref-size-480);
202
+ --plinth-size-panel: var(--plinth-ref-size-400);
203
+ --plinth-size-peek: var(--plinth-ref-size-160);
204
+ --plinth-size-menu-min: var(--plinth-ref-size-192);
205
+ --plinth-size-menu-max: var(--plinth-ref-size-320);
206
+ --plinth-layer-base: 0;
207
+ --plinth-layer-sticky: 100;
208
+ --plinth-layer-overlay: 200;
209
+ --plinth-layer-sheet: 300;
210
+ --plinth-layer-toast: 400;
211
+ --plinth-breakpoint-md: 768px;
212
+ --plinth-breakpoint-lg: 1280px;
213
+ --plinth-page-header-height: var(--plinth-space-14);
214
+ --plinth-page-header-offset: var(--plinth-space-0);
215
+ --plinth-data-table-row-height: var(--plinth-size-row);
216
+ --plinth-list-row-height: var(--plinth-size-row);
217
+ --plinth-pill-height: var(--plinth-control-md);
218
+ --plinth-dialog-width: var(--plinth-size-dialog);
219
+ --plinth-sheet-side-width: var(--plinth-size-panel);
220
+ --plinth-drawer-peek-height: var(--plinth-size-peek);
221
+ --plinth-section-menu-height: var(--plinth-space-14);
222
+ --plinth-section-menu-item-height: var(--plinth-control-lg);
223
+ --plinth-menu-min-width: var(--plinth-size-menu-min);
224
+ --plinth-menu-max-width: var(--plinth-size-menu-max);
225
+ --plinth-text-field-trailing-size: var(--plinth-control-md);
226
+ }
227
+
228
+ :root,
229
+ [data-theme="light"] {
230
+ color-scheme: light;
231
+ --plinth-color-surface: var(--plinth-ref-color-neutral-50);
232
+ --plinth-color-surface-raised: var(--plinth-ref-color-neutral-0);
233
+ --plinth-color-surface-sunken: var(--plinth-ref-color-neutral-100);
234
+ --plinth-color-surface-hover: var(--plinth-ref-color-neutral-150);
235
+ --plinth-color-text: var(--plinth-ref-color-neutral-950);
236
+ --plinth-color-text-muted: var(--plinth-ref-color-neutral-600);
237
+ --plinth-color-text-subtle: var(--plinth-ref-color-neutral-500);
238
+ --plinth-color-border: var(--plinth-ref-color-ink-alpha-10);
239
+ --plinth-color-border-strong: var(--plinth-ref-color-ink-alpha-20);
240
+ --plinth-color-divider: var(--plinth-ref-color-ink-alpha-6);
241
+ --plinth-color-primary: var(--plinth-ref-color-neutral-950);
242
+ --plinth-color-primary-hover: var(--plinth-ref-color-neutral-800);
243
+ --plinth-color-primary-active: var(--plinth-ref-color-neutral-700);
244
+ --plinth-color-on-primary: var(--plinth-ref-color-neutral-0);
245
+ --plinth-color-primary-edge: var(--plinth-ref-color-white-alpha-12);
246
+ --plinth-color-accent: var(--plinth-ref-color-brand-600);
247
+ --plinth-color-accent-text: var(--plinth-ref-color-brand-700);
248
+ --plinth-color-on-accent: var(--plinth-ref-color-neutral-0);
249
+ --plinth-color-focus-ring: var(--plinth-ref-color-brand-600);
250
+ --plinth-color-overlay: var(--plinth-ref-color-black-alpha-50);
251
+ --plinth-color-info: var(--plinth-ref-color-brand-600);
252
+ --plinth-color-info-surface: var(--plinth-ref-color-brand-100);
253
+ --plinth-color-info-text: var(--plinth-ref-color-brand-800);
254
+ --plinth-color-success: var(--plinth-ref-color-green-600);
255
+ --plinth-color-success-surface: var(--plinth-ref-color-green-100);
256
+ --plinth-color-success-text: var(--plinth-ref-color-green-800);
257
+ --plinth-color-warning: var(--plinth-ref-color-amber-500);
258
+ --plinth-color-warning-surface: var(--plinth-ref-color-amber-100);
259
+ --plinth-color-warning-text: var(--plinth-ref-color-amber-800);
260
+ --plinth-color-danger: var(--plinth-ref-color-red-600);
261
+ --plinth-color-danger-surface: var(--plinth-ref-color-red-100);
262
+ --plinth-color-danger-text: var(--plinth-ref-color-red-800);
263
+ --plinth-color-accent-hover: var(--plinth-ref-color-brand-700);
264
+ --plinth-color-accent-active: var(--plinth-ref-color-brand-800);
265
+ --plinth-color-danger-solid: var(--plinth-ref-color-red-600);
266
+ --plinth-color-danger-solid-hover: var(--plinth-ref-color-red-700);
267
+ --plinth-color-danger-solid-active: var(--plinth-ref-color-red-800);
268
+ --plinth-color-on-danger: var(--plinth-ref-color-neutral-0);
269
+ --plinth-color-accent-subtle: var(--plinth-ref-color-brand-50);
270
+ --plinth-color-accent-subtle-hover: var(--plinth-ref-color-brand-100);
271
+ --plinth-color-accent-subtle-active: var(--plinth-ref-color-brand-200);
272
+ --plinth-elevation-1: 0 1px 2px 0 #0000001a;
273
+ --plinth-elevation-2: 0 4px 12px 0 #00000026;
274
+ --plinth-elevation-3: 0 12px 32px 0 #00000026;
275
+ --plinth-callout-neutral-surface: var(--plinth-color-surface-sunken);
276
+ --plinth-callout-neutral-border: var(--plinth-color-border);
277
+ --plinth-callout-info-surface: color-mix(in srgb, var(--plinth-color-info) 6%, transparent);
278
+ --plinth-callout-info-border: color-mix(in srgb, var(--plinth-color-info) 24%, transparent);
279
+ --plinth-callout-success-surface: color-mix(in srgb, var(--plinth-color-success) 6%, transparent);
280
+ --plinth-callout-success-border: color-mix(in srgb, var(--plinth-color-success) 24%, transparent);
281
+ --plinth-callout-warning-surface: color-mix(in srgb, var(--plinth-color-warning) 6%, transparent);
282
+ --plinth-callout-warning-border: color-mix(in srgb, var(--plinth-color-warning) 24%, transparent);
283
+ --plinth-callout-danger-surface: color-mix(in srgb, var(--plinth-color-danger) 6%, transparent);
284
+ --plinth-callout-danger-border: color-mix(in srgb, var(--plinth-color-danger) 24%, transparent);
285
+ }
286
+
287
+ [data-theme="dark"],
288
+ .dark {
289
+ color-scheme: dark;
290
+ --plinth-color-surface: var(--plinth-ref-color-neutral-950);
291
+ --plinth-color-surface-raised: var(--plinth-ref-color-neutral-900);
292
+ --plinth-color-surface-sunken: var(--plinth-ref-color-neutral-1000);
293
+ --plinth-color-surface-hover: var(--plinth-ref-color-neutral-850);
294
+ --plinth-color-text: var(--plinth-ref-color-neutral-100);
295
+ --plinth-color-text-muted: var(--plinth-ref-color-neutral-300);
296
+ --plinth-color-text-subtle: var(--plinth-ref-color-neutral-400);
297
+ --plinth-color-border: var(--plinth-ref-color-chalk-alpha-10);
298
+ --plinth-color-border-strong: var(--plinth-ref-color-chalk-alpha-20);
299
+ --plinth-color-divider: var(--plinth-ref-color-chalk-alpha-6);
300
+ --plinth-color-primary: var(--plinth-ref-color-neutral-100);
301
+ --plinth-color-primary-hover: var(--plinth-ref-color-neutral-200);
302
+ --plinth-color-primary-active: var(--plinth-ref-color-neutral-300);
303
+ --plinth-color-on-primary: var(--plinth-ref-color-neutral-950);
304
+ --plinth-color-primary-edge: var(--plinth-ref-color-black-alpha-10);
305
+ --plinth-color-accent: var(--plinth-ref-color-brand-600);
306
+ --plinth-color-accent-text: var(--plinth-ref-color-brand-300);
307
+ --plinth-color-on-accent: var(--plinth-ref-color-neutral-0);
308
+ --plinth-color-focus-ring: var(--plinth-ref-color-brand-300);
309
+ --plinth-color-overlay: var(--plinth-ref-color-black-alpha-70);
310
+ --plinth-color-info: var(--plinth-ref-color-brand-400);
311
+ --plinth-color-info-surface: var(--plinth-ref-color-brand-950);
312
+ --plinth-color-info-text: var(--plinth-ref-color-brand-200);
313
+ --plinth-color-success: var(--plinth-ref-color-green-400);
314
+ --plinth-color-success-surface: var(--plinth-ref-color-green-950);
315
+ --plinth-color-success-text: var(--plinth-ref-color-green-200);
316
+ --plinth-color-warning: var(--plinth-ref-color-amber-400);
317
+ --plinth-color-warning-surface: var(--plinth-ref-color-amber-950);
318
+ --plinth-color-warning-text: var(--plinth-ref-color-amber-200);
319
+ --plinth-color-danger: var(--plinth-ref-color-red-400);
320
+ --plinth-color-danger-surface: var(--plinth-ref-color-red-950);
321
+ --plinth-color-danger-text: var(--plinth-ref-color-red-200);
322
+ --plinth-color-accent-hover: var(--plinth-ref-color-brand-700);
323
+ --plinth-color-accent-active: var(--plinth-ref-color-brand-800);
324
+ --plinth-color-danger-solid: var(--plinth-ref-color-red-600);
325
+ --plinth-color-danger-solid-hover: var(--plinth-ref-color-red-700);
326
+ --plinth-color-danger-solid-active: var(--plinth-ref-color-red-800);
327
+ --plinth-color-on-danger: var(--plinth-ref-color-neutral-0);
328
+ --plinth-color-accent-subtle: var(--plinth-ref-color-brand-950);
329
+ --plinth-color-accent-subtle-hover: var(--plinth-ref-color-brand-900);
330
+ --plinth-color-accent-subtle-active: var(--plinth-ref-color-brand-800);
331
+ --plinth-elevation-1: 0 1px 2px 0 #0000004d;
332
+ --plinth-elevation-2: 0 4px 12px 0 #00000080;
333
+ --plinth-elevation-3: 0 12px 32px 0 #00000099;
334
+ --plinth-callout-neutral-surface: var(--plinth-color-surface-sunken);
335
+ --plinth-callout-neutral-border: var(--plinth-color-border);
336
+ --plinth-callout-info-surface: color-mix(in srgb, var(--plinth-color-info) 8%, transparent);
337
+ --plinth-callout-info-border: color-mix(in srgb, var(--plinth-color-info) 24%, transparent);
338
+ --plinth-callout-success-surface: color-mix(in srgb, var(--plinth-color-success) 8%, transparent);
339
+ --plinth-callout-success-border: color-mix(in srgb, var(--plinth-color-success) 24%, transparent);
340
+ --plinth-callout-warning-surface: color-mix(in srgb, var(--plinth-color-warning) 8%, transparent);
341
+ --plinth-callout-warning-border: color-mix(in srgb, var(--plinth-color-warning) 24%, transparent);
342
+ --plinth-callout-danger-surface: color-mix(in srgb, var(--plinth-color-danger) 8%, transparent);
343
+ --plinth-callout-danger-border: color-mix(in srgb, var(--plinth-color-danger) 24%, transparent);
344
+ }
345
+
346
+ @media (prefers-color-scheme: dark) {
347
+ :root:not([data-theme="light"], .light) {
348
+ color-scheme: dark;
349
+ --plinth-color-surface: var(--plinth-ref-color-neutral-950);
350
+ --plinth-color-surface-raised: var(--plinth-ref-color-neutral-900);
351
+ --plinth-color-surface-sunken: var(--plinth-ref-color-neutral-1000);
352
+ --plinth-color-surface-hover: var(--plinth-ref-color-neutral-850);
353
+ --plinth-color-text: var(--plinth-ref-color-neutral-100);
354
+ --plinth-color-text-muted: var(--plinth-ref-color-neutral-300);
355
+ --plinth-color-text-subtle: var(--plinth-ref-color-neutral-400);
356
+ --plinth-color-border: var(--plinth-ref-color-chalk-alpha-10);
357
+ --plinth-color-border-strong: var(--plinth-ref-color-chalk-alpha-20);
358
+ --plinth-color-divider: var(--plinth-ref-color-chalk-alpha-6);
359
+ --plinth-color-primary: var(--plinth-ref-color-neutral-100);
360
+ --plinth-color-primary-hover: var(--plinth-ref-color-neutral-200);
361
+ --plinth-color-primary-active: var(--plinth-ref-color-neutral-300);
362
+ --plinth-color-on-primary: var(--plinth-ref-color-neutral-950);
363
+ --plinth-color-primary-edge: var(--plinth-ref-color-black-alpha-10);
364
+ --plinth-color-accent: var(--plinth-ref-color-brand-600);
365
+ --plinth-color-accent-text: var(--plinth-ref-color-brand-300);
366
+ --plinth-color-on-accent: var(--plinth-ref-color-neutral-0);
367
+ --plinth-color-focus-ring: var(--plinth-ref-color-brand-300);
368
+ --plinth-color-overlay: var(--plinth-ref-color-black-alpha-70);
369
+ --plinth-color-info: var(--plinth-ref-color-brand-400);
370
+ --plinth-color-info-surface: var(--plinth-ref-color-brand-950);
371
+ --plinth-color-info-text: var(--plinth-ref-color-brand-200);
372
+ --plinth-color-success: var(--plinth-ref-color-green-400);
373
+ --plinth-color-success-surface: var(--plinth-ref-color-green-950);
374
+ --plinth-color-success-text: var(--plinth-ref-color-green-200);
375
+ --plinth-color-warning: var(--plinth-ref-color-amber-400);
376
+ --plinth-color-warning-surface: var(--plinth-ref-color-amber-950);
377
+ --plinth-color-warning-text: var(--plinth-ref-color-amber-200);
378
+ --plinth-color-danger: var(--plinth-ref-color-red-400);
379
+ --plinth-color-danger-surface: var(--plinth-ref-color-red-950);
380
+ --plinth-color-danger-text: var(--plinth-ref-color-red-200);
381
+ --plinth-color-accent-hover: var(--plinth-ref-color-brand-700);
382
+ --plinth-color-accent-active: var(--plinth-ref-color-brand-800);
383
+ --plinth-color-danger-solid: var(--plinth-ref-color-red-600);
384
+ --plinth-color-danger-solid-hover: var(--plinth-ref-color-red-700);
385
+ --plinth-color-danger-solid-active: var(--plinth-ref-color-red-800);
386
+ --plinth-color-on-danger: var(--plinth-ref-color-neutral-0);
387
+ --plinth-color-accent-subtle: var(--plinth-ref-color-brand-950);
388
+ --plinth-color-accent-subtle-hover: var(--plinth-ref-color-brand-900);
389
+ --plinth-color-accent-subtle-active: var(--plinth-ref-color-brand-800);
390
+ --plinth-elevation-1: 0 1px 2px 0 #0000004d;
391
+ --plinth-elevation-2: 0 4px 12px 0 #00000080;
392
+ --plinth-elevation-3: 0 12px 32px 0 #00000099;
393
+ --plinth-callout-neutral-surface: var(--plinth-color-surface-sunken);
394
+ --plinth-callout-neutral-border: var(--plinth-color-border);
395
+ --plinth-callout-info-surface: color-mix(in srgb, var(--plinth-color-info) 8%, transparent);
396
+ --plinth-callout-info-border: color-mix(in srgb, var(--plinth-color-info) 24%, transparent);
397
+ --plinth-callout-success-surface: color-mix(in srgb, var(--plinth-color-success) 8%, transparent);
398
+ --plinth-callout-success-border: color-mix(in srgb, var(--plinth-color-success) 24%, transparent);
399
+ --plinth-callout-warning-surface: color-mix(in srgb, var(--plinth-color-warning) 8%, transparent);
400
+ --plinth-callout-warning-border: color-mix(in srgb, var(--plinth-color-warning) 24%, transparent);
401
+ --plinth-callout-danger-surface: color-mix(in srgb, var(--plinth-color-danger) 8%, transparent);
402
+ --plinth-callout-danger-border: color-mix(in srgb, var(--plinth-color-danger) 24%, transparent);
403
+ }
404
+ }
405
+
406
+ @media (prefers-reduced-motion: reduce) {
407
+ :root {
408
+ --plinth-duration-fast: 0ms;
409
+ --plinth-duration-normal: 0ms;
410
+ --plinth-duration-slow: 0ms;
411
+ }
412
+ }
413
+ }
@@ -0,0 +1,17 @@
1
+ import { type ComponentProps } from 'react';
2
+ import { type AvatarSize } from './avatar';
3
+ import { type Tone } from './tones';
4
+ interface AvatarOptions {
5
+ /** Whose avatar it is: the accessible name, and where initials come from. */
6
+ name?: string;
7
+ src?: string;
8
+ initials?: string;
9
+ size?: AvatarSize;
10
+ status?: Tone;
11
+ statusLabel?: string;
12
+ /** Hidden from screen readers, for an avatar next to the name it shows. */
13
+ decorative?: boolean;
14
+ }
15
+ export type PlinthAvatarProps = AvatarOptions & Omit<ComponentProps<'span'>, keyof AvatarOptions | 'children'>;
16
+ export declare function PlinthAvatar({ name, src, initials, size, status, statusLabel, decorative, className, ...rest }: PlinthAvatarProps): import("react").JSX.Element;
17
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { ComponentProps } from 'react';
2
+ import { type Tone } from './tones';
3
+ export type PlinthBadgeProps = ComponentProps<'span'> & {
4
+ tone?: Tone;
5
+ dot?: boolean;
6
+ };
7
+ export declare function PlinthBadge({ tone, dot, className, children, ...rest }: PlinthBadgeProps): import("react").JSX.Element;
@@ -0,0 +1,29 @@
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ import { type ButtonVariant, type InvokerCommandProps } from './button';
3
+ import { type ControlSize } from './size';
4
+ interface ButtonOptions {
5
+ variant?: ButtonVariant;
6
+ size?: ControlSize;
7
+ disabled?: boolean;
8
+ /** Working: a spinner in the leading icon's place, and the button reads as busy. */
9
+ busy?: boolean;
10
+ /** The leading icon (Vue's `icon` slot). */
11
+ icon?: ReactNode;
12
+ /** The trailing icon (Vue's `trailing` slot). */
13
+ trailing?: ReactNode;
14
+ /** Flips the leading icon in right-to-left text, for icons that point a direction. */
15
+ mirrorIcon?: boolean;
16
+ /** Flips the trailing icon in right-to-left text, for an arrow such as Next. */
17
+ mirrorTrailing?: boolean;
18
+ }
19
+ /**
20
+ * A `<button>`, or with an `href` a link that looks like one. The button takes `commandfor` and
21
+ * `command`; a link doesn't, since invoker commands are a button's.
22
+ */
23
+ export type PlinthButtonProps = (ButtonOptions & InvokerCommandProps & Omit<ComponentProps<'button'>, keyof ButtonOptions | keyof InvokerCommandProps> & {
24
+ href?: undefined;
25
+ }) | (ButtonOptions & Omit<ComponentProps<'a'>, keyof ButtonOptions> & {
26
+ href: string;
27
+ });
28
+ export declare function PlinthButton({ href, variant, size, disabled, busy, icon, trailing, mirrorIcon, mirrorTrailing, className, children, ...rest }: PlinthButtonProps): import("react").JSX.Element;
29
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ import { type CalloutRole, type CalloutTone } from './callout';
3
+ interface CalloutOptions {
4
+ tone?: CalloutTone;
5
+ /** `note` for a note in the page; `status` or `alert` for a message the app adds. */
6
+ role?: CalloutRole;
7
+ /** A short title above the text; it may hold a little markup. */
8
+ title?: ReactNode;
9
+ /** Buttons or links under the text (Vue's actions slot). */
10
+ actions?: ReactNode;
11
+ /** The project's own SVG in place of the tone's icon (Vue's icon slot). */
12
+ icon?: ReactNode;
13
+ }
14
+ export type PlinthCalloutProps = CalloutOptions & Omit<ComponentProps<'div'>, keyof CalloutOptions>;
15
+ export declare function PlinthCallout({ tone, role, title, actions, icon, className, children, ...rest }: PlinthCalloutProps): import("react").JSX.Element;
16
+ export {};