@typlog/ui 0.13.1 → 0.15.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.
package/addons.css CHANGED
@@ -37,118 +37,240 @@
37
37
  background-color: var(--gray-a2);
38
38
  }
39
39
 
40
- .ui-IconifySample {
41
- display: flex;
42
- gap: var(--space-4);
43
- padding: var(--space-2);
44
- justify-content: space-between;
45
- align-items: center;
46
- text-align: left;
47
- border-radius: var(--radius-3);
48
- background: var(--gray-a2);
49
- }
50
- .ui-IconifySample:hover {
51
- background: var(--gray-a3);
52
- }
53
- .ui-IconifySampleInfo {
54
- display: flex;
55
- flex-direction: column;
56
- gap: var(--space-1);
40
+ @layer components {
41
+ .ui-IconGrid {
42
+ display: flex;
43
+ min-width: 0;
44
+ flex-direction: column;
45
+ gap: var(--space-3);
46
+ }
47
+ .ui-IconGridHeader {
48
+ display: flex;
49
+ gap: var(--space-4);
50
+ align-items: center;
51
+ }
52
+ .ui-IconGridSearch {
53
+ width: 100%;
54
+ }
55
+ .ui-IconGridTabs {
56
+ display: inline-flex;
57
+ align-self: flex-start;
58
+ max-width: 100%;
59
+ overflow-x: auto;
60
+ padding: 2px;
61
+ gap: 2px;
62
+ background: var(--gray-a3);
63
+ border-radius: var(--radius-3);
64
+ }
65
+ .ui-IconGridTabs button {
66
+ padding: var(--space-1) var(--space-3);
67
+ color: var(--gray-a11);
68
+ font-size: var(--font-size-1);
69
+ line-height: var(--line-height-1);
70
+ white-space: nowrap;
71
+ background: transparent;
72
+ border: 1px solid transparent;
73
+ border-radius: var(--radius-2);
74
+ cursor: pointer;
75
+ }
76
+ .ui-IconGridTabs button:hover,
77
+ .ui-IconGridTabs button.is-active {
78
+ color: var(--gray-12);
79
+ background: var(--color-panel-solid);
80
+ border-color: var(--gray-a5);
81
+ }
82
+ .ui-IconGridTabs button:focus-visible,
83
+ .ui-IconGridCell:focus-visible {
84
+ outline: 2px solid var(--focus-8);
85
+ outline-offset: 2px;
86
+ }
87
+ .ui-IconGridViewport {
88
+ position: relative;
89
+ box-sizing: border-box;
90
+ min-width: 0;
91
+ overflow: auto;
92
+ overscroll-behavior: contain;
93
+ border-radius: var(--radius-3);
94
+ outline: none;
95
+ }
96
+ .ui-IconGridViewport:focus-visible {
97
+ outline: 2px solid var(--focus-8);
98
+ outline-offset: 2px;
99
+ }
100
+ .ui-IconGridContent {
101
+ position: relative;
102
+ width: 100%;
103
+ }
104
+ .ui-IconGridRow {
105
+ position: absolute;
106
+ top: 0;
107
+ left: 0;
108
+ display: flex;
109
+ width: 100%;
110
+ align-items: stretch;
111
+ }
112
+ .ui-IconGridCell {
113
+ display: grid;
114
+ flex: 0 0 auto;
115
+ place-items: center;
116
+ min-width: 0;
117
+ height: 100%;
118
+ padding: var(--space-2);
119
+ color: var(--gray-12);
120
+ background: transparent;
121
+ border: 1px solid transparent;
122
+ border-radius: var(--radius-3);
123
+ cursor: pointer;
124
+ }
125
+ .ui-IconGridCell:hover,
126
+ .ui-IconGridCell[aria-pressed='true'] {
127
+ background: var(--gray-a3);
128
+ }
129
+ .ui-IconGridMessage {
130
+ display: grid;
131
+ height: 100%;
132
+ min-height: 8rem;
133
+ place-items: center;
134
+ padding: var(--space-6);
135
+ color: var(--gray-a11);
136
+ text-align: center;
57
137
  }
58
- .ui-IconifySampleInfo > strong {
59
- font-weight: var(--font-weight-medium);
60
- font-size: var(--font-size-2);
61
- line-height: var(--line-height-2);
62
138
  }
63
- .ui-IconifySampleInfo > span {
64
- font-weight: var(--font-weight-regular);
65
- font-size: var(--font-size-1);
66
- line-height: var(--line-height-1);
67
- color: var(--gray-a10);
139
+
140
+ @layer components {
141
+ .ui-IconCollection {
142
+ container-name: icon-collection;
143
+ container-type: inline-size;
144
+ min-width: 0;
145
+ }
146
+ .ui-IconCollectionBrowser {
147
+ box-sizing: border-box;
148
+ min-width: 0;
149
+ overflow: auto;
150
+ overscroll-behavior: contain;
151
+ border-radius: var(--radius-3);
152
+ outline: none;
153
+ }
154
+ .ui-IconCollectionBrowser:focus-visible {
155
+ outline: 2px solid var(--focus-8);
156
+ outline-offset: 2px;
157
+ }
158
+ .ui-IconCollectionToolbar {
159
+ display: flex;
160
+ flex-direction: column;
161
+ align-items: stretch;
162
+ gap: var(--space-4);
163
+ margin-bottom: var(--space-4);
164
+ }
165
+ .ui-IconCollectionFilter {
166
+ flex: 1 1 auto;
167
+ }
168
+ .ui-IconCollectionTitle,
169
+ .ui-IconCollectionGroupTitle {
170
+ font-weight: var(--font-weight-medium);
171
+ }
172
+ .ui-IconCollectionTitle {
173
+ font-size: var(--font-size-4);
174
+ line-height: var(--line-height-4);
175
+ }
176
+ .ui-IconCollectionGroupTitle span:last-child,
177
+ .ui-IconCollectionInfo span {
178
+ color: var(--gray-a10);
179
+ font-size: var(--font-size-1);
180
+ line-height: var(--line-height-1);
181
+ }
182
+ .ui-IconCollectionGroup {
183
+ margin-bottom: var(--space-4);
184
+ }
185
+ .ui-IconCollectionGroup:last-child {
186
+ margin-bottom: 0;
187
+ }
188
+ .ui-IconCollectionGroupTitle {
189
+ display: flex;
190
+ align-items: baseline;
191
+ gap: var(--space-1);
192
+ margin-bottom: var(--space-2);
193
+ font-size: var(--font-size-3);
194
+ line-height: var(--line-height-3);
195
+ }
196
+ .ui-IconCollectionCards {
197
+ display: grid;
198
+ grid-template-columns: repeat(1, minmax(0, 1fr));
199
+ gap: var(--space-2);
200
+ }
201
+ .ui-IconCollectionCard {
202
+ display: flex;
203
+ align-items: center;
204
+ justify-content: space-between;
205
+ gap: var(--space-3);
206
+ width: 100%;
207
+ padding: var(--space-2);
208
+ color: inherit;
209
+ text-align: start;
210
+ background: var(--gray-a2);
211
+ border: 1px solid transparent;
212
+ border-radius: var(--radius-3);
213
+ cursor: pointer;
214
+ }
215
+ .ui-IconCollectionCard:hover {
216
+ background: var(--gray-a3);
217
+ border-color: var(--accent-6);
218
+ }
219
+ .ui-IconCollectionCard:focus-visible {
220
+ outline: 2px solid var(--focus-8);
221
+ outline-offset: 2px;
222
+ }
223
+ .ui-IconCollectionInfo {
224
+ display: flex;
225
+ min-width: 0;
226
+ flex-direction: column;
227
+ gap: var(--space-1);
228
+ }
229
+ .ui-IconCollectionInfo strong {
230
+ overflow: hidden;
231
+ font-size: var(--font-size-2);
232
+ line-height: var(--line-height-2);
233
+ font-weight: var(--font-weight-medium);
234
+ text-overflow: ellipsis;
235
+ white-space: nowrap;
236
+ }
237
+ .ui-IconCollectionSamples {
238
+ display: grid;
239
+ flex: none;
240
+ grid-template-columns: repeat(3, minmax(0, 1fr));
241
+ gap: var(--space-2);
68
242
  }
69
- .ui-IconifySampleIcons {
70
- display: grid;
71
- grid-template-columns: repeat(3, minmax(0, 1fr));
72
- gap: var(--space-2);
243
+ .ui-IconCollectionMessage {
244
+ display: grid;
245
+ min-height: 8rem;
246
+ place-items: center;
247
+ padding: var(--space-6);
248
+ color: var(--gray-a11);
249
+ text-align: center;
73
250
  }
74
-
75
- .ui-IconifyCollection {
76
- container-name: icon-collection;
77
- container-type: inline-size;
78
- }
79
- .ui-IconifyCollectionForm {
80
- display: flex;
81
- flex-grow: 1;
82
- align-items: center;
83
- gap: var(--space-4);
84
- }
85
- .ui-IconifyCollectionForm .ui-TextField {
86
- flex-grow: 1;
87
- }
88
- .ui-IconifyCollectionGroupsHead {
89
- display: flex;
90
- flex-direction: column;
91
- align-items: center;
92
- gap: var(--space-8);
93
- margin-bottom: var(--space-4);
94
251
  }
95
252
  @container icon-collection (min-width: 768px) {
96
- .ui-IconifyCollectionGroupsHead {
253
+ .ui-IconCollectionToolbar {
97
254
  flex-direction: row;
255
+ align-items: center;
98
256
  }
257
+ .ui-IconCollectionFilter {
258
+ max-width: 28rem;
99
259
  }
100
- .ui-IconifyCollectionGroupsHead > h1 {
101
- font-weight: var(--font-weight-medium);
102
- font-size: var(--font-size-4);
103
- line-height: var(--line-height-4);
104
- }
105
- .ui-IconifyCollectionSample {
106
- margin-bottom: var(--space-4);
107
- }
108
- .ui-IconifyCollectionSampleGrid {
109
- margin-top: var(--space-2);
110
- display: grid;
111
- gap: var(--space-2);
112
- grid-template-columns: repeat(1, minmax(0, 1fr));
113
- }
114
- @container icon-collection (min-width: 768px) {
115
- .ui-IconifyCollectionSampleGrid {
260
+ .ui-IconCollectionCards {
116
261
  grid-template-columns: repeat(2, minmax(0, 1fr));
117
262
  }
118
263
  }
119
264
  @container icon-collection (min-width: 1024px) {
120
- .ui-IconifyCollectionSampleGrid {
265
+ .ui-IconCollectionCards {
121
266
  grid-template-columns: repeat(3, minmax(0, 1fr));
122
267
  }
123
268
  }
124
269
  @container icon-collection (min-width: 1280px) {
125
- .ui-IconifyCollectionSampleGrid {
270
+ .ui-IconCollectionCards {
126
271
  grid-template-columns: repeat(4, minmax(0, 1fr));
127
272
  }
128
273
  }
129
- .ui-IconifyCollectionSuffixes {
130
- display: flex;
131
- flex-wrap: wrap;
132
- gap: var(--space-2);
133
- flex-grow: 1;
134
- margin-top: var(--space-4);
135
- }
136
- .ui-IconifyCollectionIconGrid {
137
- display: flex;
138
- flex-wrap: wrap;
139
- gap: var(--space-3);
140
- flex-grow: 1;
141
- margin-top: var(--space-4);
142
- margin-bottom: var(--space-4);
143
- }
144
- .ui-IconifyCollectionIconGrid button {
145
- border: 0;
146
- padding: var(--space-2);
147
- border-radius: max(var(--radius-2), var(--radius-full));
148
- }
149
- .ui-IconifyCollectionIconGrid button:hover {
150
- background-color: var(--gray-a4);
151
- }
152
274
 
153
275
  .ui-Turnstile {
154
276
  background: var(--gray-a3);
package/addons.d.ts CHANGED
@@ -6,7 +6,80 @@ import { DefineComponent } from 'vue';
6
6
  import { PrimitiveProps } from 'reka-ui';
7
7
  import { PublicProps } from 'vue';
8
8
 
9
- declare type __VLS_WithTemplateSlots<T, S> = T & {
9
+ declare const __VLS_export: __VLS_WithSlots< DefineComponent<SocialButtonProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<SocialButtonProps> & Readonly<{}>, {
10
+ as: AsTag | Component;
11
+ size: "1" | "2" | "3" | "4";
12
+ variant: "classic" | "solid" | "soft" | "surface" | "outline";
13
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>, {
14
+ default?: (props: {}) => any;
15
+ }>;
16
+
17
+ declare const __VLS_export_2: DefineComponent<IconCollectionProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
18
+ select: (icon: string) => any;
19
+ "update:modelValue": (icon: string) => any;
20
+ "update:query": (query: string) => any;
21
+ "update:collection": (prefix: string) => any;
22
+ "update:filter": (filter: string) => any;
23
+ }, string, PublicProps, Readonly<IconCollectionProps> & Readonly<{
24
+ onSelect?: ((icon: string) => any) | undefined;
25
+ "onUpdate:modelValue"?: ((icon: string) => any) | undefined;
26
+ "onUpdate:query"?: ((query: string) => any) | undefined;
27
+ "onUpdate:collection"?: ((prefix: string) => any) | undefined;
28
+ "onUpdate:filter"?: ((filter: string) => any) | undefined;
29
+ }>, {
30
+ filter: string;
31
+ overscan: number;
32
+ height: string | number;
33
+ query: string;
34
+ iconSize: string | number;
35
+ cellSize: number;
36
+ collection: string;
37
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
38
+
39
+ declare const __VLS_export_3: __VLS_WithSlots_2< DefineComponent<IconGridProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
40
+ select: (icon: string) => any;
41
+ "update:modelValue": (icon: string) => any;
42
+ "update:query": (query: string) => any;
43
+ "update:activeCollection": (prefix: string) => any;
44
+ }, string, PublicProps, Readonly<IconGridProps> & Readonly<{
45
+ onSelect?: ((icon: string) => any) | undefined;
46
+ "onUpdate:modelValue"?: ((icon: string) => any) | undefined;
47
+ "onUpdate:query"?: ((query: string) => any) | undefined;
48
+ "onUpdate:activeCollection"?: ((prefix: string) => any) | undefined;
49
+ }>, {
50
+ overscan: number;
51
+ height: string | number;
52
+ collections: string[];
53
+ query: string;
54
+ activeCollection: string;
55
+ iconSize: string | number;
56
+ cellSize: number;
57
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>, {
58
+ 'header-leading'?: (props: {}) => any;
59
+ } & {
60
+ 'header-search'?: (props: {}) => any;
61
+ }>;
62
+
63
+ declare const __VLS_export_4: DefineComponent<TurnstileProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
64
+ "update:modelValue": (args_0: string) => any;
65
+ }, string, PublicProps, Readonly<TurnstileProps> & Readonly<{
66
+ "onUpdate:modelValue"?: ((args_0: string) => any) | undefined;
67
+ }>, {
68
+ size: "normal" | "compact";
69
+ theme: "light" | "dark" | "auto";
70
+ action: string;
71
+ resetInterval: number;
72
+ appearance: "always" | "execute" | "interaction-only";
73
+ renderOnMount: boolean;
74
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
75
+
76
+ declare type __VLS_WithSlots<T, S> = T & {
77
+ new (): {
78
+ $slots: S;
79
+ };
80
+ };
81
+
82
+ declare type __VLS_WithSlots_2<T, S> = T & {
10
83
  new (): {
11
84
  $slots: S;
12
85
  };
@@ -14,31 +87,120 @@ declare type __VLS_WithTemplateSlots<T, S> = T & {
14
87
 
15
88
  declare type BrandType = 'google' | 'facebook' | 'x' | 'github' | 'apple' | 'slack' | 'figma';
16
89
 
17
- export declare const IconifyCollection: DefineComponent<IconifyCollectionProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
18
- select: (icon: string) => any;
19
- }, string, PublicProps, Readonly<IconifyCollectionProps> & Readonly<{
20
- onSelect?: ((icon: string) => any) | undefined;
21
- }>, {
22
- perpage: number;
23
- iconSize: string | number;
24
- }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
90
+ export declare const IconCollection: typeof __VLS_export_2;
25
91
 
26
- export declare interface IconifyCollectionProps {
27
- prefix?: string;
28
- search?: string;
29
- perpage?: number;
92
+ export declare interface IconCollectionEmits {
93
+ (event: 'update:modelValue', icon: string): void;
94
+ (event: 'update:collection', prefix: string): void;
95
+ (event: 'update:query', query: string): void;
96
+ (event: 'update:filter', filter: string): void;
97
+ (event: 'select', icon: string): void;
98
+ }
99
+
100
+ export declare interface IconCollectionProps {
101
+ /** The selected icon name, such as `lucide:heart`. */
102
+ modelValue?: string;
103
+ /** The current icon set prefix. An empty value displays the collection catalog. */
104
+ collection?: string;
105
+ /** The current search query within the selected icon set. */
106
+ query?: string;
107
+ /** The current collection catalog filter. */
108
+ filter?: string;
109
+ /** Size of each rendered icon. @default 20 */
30
110
  iconSize?: string | number;
111
+ /** Width and height of each icon button. @default 40 */
112
+ cellSize?: number;
113
+ /** Height of the catalog or icon grid scroll viewport. @default 420 */
114
+ height?: string | number;
115
+ /** Number of extra icon rows rendered outside the viewport. @default 4 */
116
+ overscan?: number;
117
+ /** Classes for the component's stable visual parts. */
118
+ ui?: IconCollectionUI;
31
119
  }
32
120
 
33
- declare type RadiusType = 'none' | 'small' | 'medium' | 'large' | 'full';
121
+ export declare interface IconCollectionUI {
122
+ base?: string;
123
+ browser?: string;
124
+ toolbar?: string;
125
+ title?: string;
126
+ filter?: string;
127
+ groups?: string;
128
+ group?: string;
129
+ groupTitle?: string;
130
+ cards?: string;
131
+ card?: string;
132
+ info?: string;
133
+ samples?: string;
134
+ message?: string;
135
+ back?: string;
136
+ grid?: IconGridUI;
137
+ }
34
138
 
35
- export declare const SocialButton: __VLS_WithTemplateSlots<DefineComponent<SocialButtonProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<SocialButtonProps> & Readonly<{}>, {
36
- as: AsTag | Component;
37
- size: "1" | "2" | "3" | "4";
38
- variant: "classic" | "solid" | "soft" | "surface" | "outline";
39
- }, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>, {
40
- default?(_: {}): any;
41
- }>;
139
+ export declare const IconGrid: typeof __VLS_export_3;
140
+
141
+ export declare interface IconGridEmits {
142
+ (event: 'update:modelValue', icon: string): void;
143
+ (event: 'update:query', query: string): void;
144
+ (event: 'update:activeCollection', prefix: string): void;
145
+ (event: 'select', icon: string): void;
146
+ }
147
+
148
+ export declare interface IconGridProps {
149
+ /** Iconify collection prefixes to display. */
150
+ collections?: string[];
151
+ /** The selected icon name, such as `lucide:heart`. */
152
+ modelValue?: string;
153
+ /** The current icon search query. */
154
+ query?: string;
155
+ /** Active collection prefix; an empty value displays all collections. */
156
+ activeCollection?: string;
157
+ /** Size of each rendered icon. @default 20 */
158
+ iconSize?: string | number;
159
+ /** Width and height of each icon button. @default 40 */
160
+ cellSize?: number;
161
+ /** Height of the scroll viewport. @default 420 */
162
+ height?: string | number;
163
+ /** Classes for the component's stable visual parts. */
164
+ ui?: IconGridUI;
165
+ /** Number of extra rows rendered outside the viewport. @default 4 */
166
+ overscan?: number;
167
+ }
168
+
169
+ export declare interface IconGridUI {
170
+ base?: string;
171
+ header?: string;
172
+ search?: string;
173
+ tabs?: string;
174
+ tab?: string;
175
+ viewport?: string;
176
+ content?: string;
177
+ cell?: string;
178
+ message?: string;
179
+ }
180
+
181
+ export declare interface IconifyCollectionGroup {
182
+ category: string;
183
+ items: IconifyCollectionItem[];
184
+ }
185
+
186
+ export declare interface IconifyCollectionItem {
187
+ prefix: string;
188
+ category: string;
189
+ name: string;
190
+ samples: string[];
191
+ total: number;
192
+ license?: {
193
+ title: string;
194
+ spdx?: string;
195
+ url?: string;
196
+ };
197
+ hidden?: boolean;
198
+ [key: string]: unknown;
199
+ }
200
+
201
+ declare type RadiusType = 'none' | 'small' | 'medium' | 'large' | 'full'
202
+
203
+ export declare const SocialButton: typeof __VLS_export;
42
204
 
43
205
  export declare interface SocialButtonProps extends PrimitiveProps {
44
206
  brand: BrandType;
@@ -52,20 +214,7 @@ export declare interface SocialButtonProps extends PrimitiveProps {
52
214
  disabled?: boolean;
53
215
  }
54
216
 
55
- export declare const Turnstile: DefineComponent<TurnstileProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
56
- "update:modelValue": (args_0: string) => any;
57
- }, string, PublicProps, Readonly<TurnstileProps> & Readonly<{
58
- "onUpdate:modelValue"?: ((args_0: string) => any) | undefined;
59
- }>, {
60
- size: "normal" | "compact";
61
- theme: "light" | "dark" | "auto";
62
- action: string;
63
- resetInterval: number;
64
- appearance: "always" | "execute" | "interaction-only";
65
- renderOnMount: boolean;
66
- }, {}, {}, {}, string, ComponentProvideOptions, false, {
67
- element: HTMLDivElement;
68
- }, HTMLDivElement>;
217
+ export declare const Turnstile: typeof __VLS_export_4;
69
218
 
70
219
  export declare interface TurnstileProps {
71
220
  sitekey: string;
@@ -79,3 +228,11 @@ export declare interface TurnstileProps {
79
228
  }
80
229
 
81
230
  export { }
231
+
232
+
233
+ declare global {
234
+ interface Window {
235
+ turnstile: any;
236
+ [turnstileLoadFunction]: any;
237
+ }
238
+ }