@cryptlex/web-components 6.6.6-alpha05 → 6.6.6-alpha08

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sources":["../../lib/components/toast.tsx"],"sourcesContent":["import type { VariantProps } from 'class-variance-authority';\nimport {\n UNSTABLE_Toast as AriaToast,\n UNSTABLE_ToastContent as AriaToastContent,\n UNSTABLE_ToastQueue as AriaToastQueue,\n UNSTABLE_ToastRegion as AriaToastRegion,\n} from 'react-aria-components';\nimport { flushSync } from 'react-dom';\nimport { classNames } from '../utilities/theme';\nimport { alertVariants } from './alert';\nimport { Button } from './button';\nimport { IcCheck, IcError, IcInfo } from './icons';\n\nexport interface ToastProps {\n title: string;\n description?: string;\n variant: VariantProps<typeof alertVariants>['variant'];\n action?: () => void;\n timeout?: number;\n}\n\n/**\n * Toast queue.\n * @returns The toast queue.\n */\nconst queue = new AriaToastQueue<ToastProps>({\n wrapUpdate(fn) {\n if ('startViewTransition' in document) {\n document.startViewTransition(() => {\n flushSync(fn);\n });\n } else {\n fn();\n }\n },\n});\n\n/**\n * Toast provider.\n * @returns The toast provider.\n */\nexport function ToastProvider() {\n return (\n <AriaToastRegion queue={queue} className=\"fixed z-50 top-4 right-4 flex flex-col-reverse justify-end gap-2\">\n {({ toast }) => (\n <AriaToast style={{ viewTransitionName: toast.key }} toast={toast}>\n <AriaToastContent\n className={classNames(\n alertVariants({ variant: toast.content.variant }),\n 'flex flex-row items-center gap-3 w-full'\n )}\n >\n <div className=\"shrink-0\">{getToastIcon(toast.content.variant)}</div>\n <div className=\"flex-1 min-w-0\">\n <p slot=\"title\">{toast.content.title}</p>\n {toast.content.description && <p slot=\"description\">{toast.content.description}</p>}\n </div>\n <Button slot=\"close\" variant=\"neutral\">\n Close\n </Button>\n </AriaToastContent>\n </AriaToast>\n )}\n </AriaToastRegion>\n );\n}\n\n/**\n * Get the icon for a toast notification.\n * @param variant - The variant of the toast.\n * @returns The icon for the toast.\n */\nfunction getToastIcon(variant: ToastProps['variant']) {\n switch (variant) {\n case 'destructive':\n return <IcError />;\n case 'success':\n return <IcCheck />;\n case 'muted':\n return <IcInfo />;\n default:\n return <IcInfo />;\n }\n}\n\n/**\n * Show a toast notification.\n * @param title - The title of the toast.\n * @param description - The description of the toast.\n * @param variant - The variant of the toast.\n * @param timeout - The timeout of the toast.\n */\nexport function toast({\n title,\n description,\n variant,\n timeout,\n}: {\n title: string;\n description?: string;\n variant: ToastProps['variant'];\n timeout?: number;\n}) {\n queue.add({ title, description, variant }, { timeout: timeout ?? 2000 });\n}\n"],"names":["queue","AriaToastQueue","fn","flushSync","ToastProvider","AriaToastRegion","toast","jsx","AriaToast","jsxs","AriaToastContent","classNames","alertVariants","Button","getToastIcon","variant","IcError","IcCheck","IcInfo","title","description","timeout"],"mappings":"8eAyBA,MAAMA,EAAQ,IAAIC,EAA2B,CACzC,WAAWC,EAAI,CACP,wBAAyB,SACzB,SAAS,oBAAoB,IAAM,CAC/BC,EAAUD,CAAE,CAChB,CAAC,EAEDA,EAAA,CAER,CACJ,CAAC,EAMM,SAASE,GAAgB,CAC5B,SACKC,EAAA,CAAgB,MAAAL,EAAc,UAAU,mEACpC,SAAA,CAAC,CAAE,MAAAM,CAAAA,IACAC,EAACC,EAAA,CAAU,MAAO,CAAE,mBAAoBF,EAAM,GAAA,EAAO,MAAOA,EACxD,SAAAG,EAACC,EAAA,CACG,UAAWC,EACPC,EAAc,CAAE,QAASN,EAAM,QAAQ,QAAS,EAChD,yCAAA,EAGJ,SAAA,CAAAC,EAAC,OAAI,UAAU,WAAY,WAAaD,EAAM,QAAQ,OAAO,EAAE,EAC/DG,EAAC,MAAA,CAAI,UAAU,iBACX,SAAA,CAAAF,EAAC,KAAE,KAAK,QAAS,SAAAD,EAAM,QAAQ,MAAM,EACpCA,EAAM,QAAQ,aAAeC,EAAC,IAAA,CAAE,KAAK,cAAe,SAAAD,EAAM,QAAQ,WAAA,CAAY,CAAA,EACnF,IACCO,EAAA,CAAO,KAAK,QAAQ,QAAQ,UAAU,SAAA,OAAA,CAEvC,CAAA,CAAA,CAAA,EAER,CAAA,CAER,CAER,CAOA,SAASC,EAAaC,EAAgC,CAClD,OAAQA,EAAA,CACJ,IAAK,cACD,SAAQC,EAAA,EAAQ,EACpB,IAAK,UACD,SAAQC,EAAA,EAAQ,EACpB,IAAK,QACD,SAAQC,EAAA,EAAO,EACnB,QACI,SAAQA,EAAA,EAAO,CAAA,CAE3B,CASO,SAASZ,EAAM,CAClB,MAAAa,EACA,YAAAC,EACA,QAAAL,EACA,QAAAM,CACJ,EAKG,CACCrB,EAAM,IAAI,CAAE,MAAAmB,EAAO,YAAAC,EAAa,QAAAL,CAAA,EAAW,CAAE,QAASM,GAAW,IAAM,CAC3E"}
@@ -7,7 +7,7 @@ type FieldContextProps = {
7
7
  * @param {boolean} disabled - The disabled prop passed to the component
8
8
  * @returns The field context with disabled state properly managed
9
9
  */
10
- export declare const useTfFieldContext: <T>({ disabled }: FieldContextProps) => FieldApi<any, string, T, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>;
10
+ export declare function useTfFieldContext<T>({ disabled }: FieldContextProps): FieldApi<any, string, T, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>;
11
11
  /** Utility type to simplify FormApi usage */
12
12
  export type AppFormApi<TValues> = FormApi<TValues, any, any, any, any, any, any, any, any, any>;
13
13
  /**
@@ -1,2 +1,2 @@
1
- import o from"react";import{useFieldContext as r}from"./form-context.js";import"@tanstack/react-form";const l=({disabled:e})=>{const t=r();return o.useEffect(()=>{t.setMeta(n=>({...n,disabled:!!e}))},[e,t]),t};function d(e){return async({formApi:t})=>{const n=i(t.state.values,t);await e({values:n,formApi:t})}}function i(e,t){const n={};for(const s in e)t.getFieldMeta(s)?.disabled||(n[s]=e[s]);return n}function m(e){return e?.state.meta.errors.map(t=>t?.message).join(",")}export{m as getFieldErrorMessage,d as tfOnSubmit,l as useTfFieldContext};
1
+ import o from"react";import{useFieldContext as r}from"./form-context.js";import"@tanstack/react-form";function l({disabled:e}){const t=r();return o.useEffect(()=>{t.setMeta(n=>({...n,disabled:!!e}))},[e,t]),t}function d(e){return async({formApi:t})=>{const n=i(t.state.values,t);await e({values:n,formApi:t})}}function i(e,t){const n={};for(const s in e)t.getFieldMeta(s)?.disabled||(n[s]=e[s]);return n}function m(e){return e?.state.meta.errors.map(t=>t?.message).join(",")}export{m as getFieldErrorMessage,d as tfOnSubmit,l as useTfFieldContext};
2
2
  //# sourceMappingURL=form.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form.js","sources":["../../lib/utilities/form.tsx"],"sourcesContent":["import { type AnyFieldMeta, type FieldApi, type FormApi } from '@tanstack/react-form';\nimport React from 'react';\nimport { useFieldContext } from './form-context';\n\ntype FieldContextProps = {\n disabled?: boolean;\n};\n\n/**\n * Custom hook to handle disabled state for form fields\n * @param {boolean} disabled - The disabled prop passed to the component\n * @returns The field context with disabled state properly managed\n */\nexport const useTfFieldContext = <T,>({ disabled }: FieldContextProps) => {\n const field = useFieldContext<T>();\n\n React.useEffect(() => {\n field.setMeta(meta => ({\n ...meta,\n disabled: !!disabled,\n }));\n }, [disabled, field]);\n\n return field;\n};\n\n/** Utility type to simplify FormApi usage */\nexport type AppFormApi<TValues> = FormApi<TValues, any, any, any, any, any, any, any, any, any>;\n\n/**\n * Utility function to submit a form with a handler that receives the values and the formApi.\n * @param onSubmit - The handler function to call with the values and the formApi.\n * @returns A function that can be used to submit the form. It will filter out disabled fields from the values.\n */\nexport function tfOnSubmit<TValues>(\n onSubmit: ({ values, formApi }: { values: TValues; formApi: AppFormApi<TValues> }) => Promise<any> | any\n) {\n return async ({ formApi }: { formApi: AppFormApi<TValues> }): Promise<any> => {\n const values = pickEnabledFields(formApi.state.values, formApi);\n\n await onSubmit({ values, formApi });\n };\n}\nfunction pickEnabledFields<TValues>(rawValues: TValues, formApi: AppFormApi<TValues>): TValues {\n const result: TValues = {} as TValues;\n\n //TODO: Nested objects are not supported yet\n for (const key in rawValues) {\n const meta = formApi.getFieldMeta(key) as AnyFieldMeta & {\n disabled?: boolean;\n };\n if (!meta?.disabled) {\n result[key] = rawValues[key];\n }\n }\n\n return result;\n}\n\nexport function getFieldErrorMessage(\n field: FieldApi<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>\n): string {\n return field?.state.meta.errors.map(e => e?.message).join(',');\n}\n"],"names":["useTfFieldContext","disabled","field","useFieldContext","React","meta","tfOnSubmit","onSubmit","formApi","values","pickEnabledFields","rawValues","result","key","getFieldErrorMessage","e"],"mappings":"sGAaO,MAAMA,EAAoB,CAAK,CAAE,SAAAC,KAAkC,CACtE,MAAMC,EAAQC,EAAA,EAEd,OAAAC,EAAM,UAAU,IAAM,CAClBF,EAAM,QAAQG,IAAS,CACnB,GAAGA,EACH,SAAU,CAAC,CAACJ,CAAA,EACd,CACN,EAAG,CAACA,EAAUC,CAAK,CAAC,EAEbA,CACX,EAUO,SAASI,EACZC,EACF,CACE,MAAO,OAAO,CAAE,QAAAC,KAA8D,CAC1E,MAAMC,EAASC,EAAkBF,EAAQ,MAAM,OAAQA,CAAO,EAE9D,MAAMD,EAAS,CAAE,OAAAE,EAAQ,QAAAD,EAAS,CACtC,CACJ,CACA,SAASE,EAA2BC,EAAoBH,EAAuC,CAC3F,MAAMI,EAAkB,CAAA,EAGxB,UAAWC,KAAOF,EACDH,EAAQ,aAAaK,CAAG,GAG1B,WACPD,EAAOC,CAAG,EAAIF,EAAUE,CAAG,GAInC,OAAOD,CACX,CAEO,SAASE,EACZZ,EACM,CACN,OAAOA,GAAO,MAAM,KAAK,OAAO,OAASa,GAAG,OAAO,EAAE,KAAK,GAAG,CACjE"}
1
+ {"version":3,"file":"form.js","sources":["../../lib/utilities/form.tsx"],"sourcesContent":["import { type AnyFieldMeta, type FieldApi, type FormApi } from '@tanstack/react-form';\nimport React from 'react';\nimport { useFieldContext } from './form-context';\n\ntype FieldContextProps = {\n disabled?: boolean;\n};\n\n/**\n * Custom hook to handle disabled state for form fields\n * @param {boolean} disabled - The disabled prop passed to the component\n * @returns The field context with disabled state properly managed\n */\nexport function useTfFieldContext<T>({ disabled }: FieldContextProps) {\n const field = useFieldContext<T>();\n\n React.useEffect(() => {\n field.setMeta(meta => ({\n ...meta,\n disabled: !!disabled,\n }));\n }, [disabled, field]);\n\n return field;\n}\n\n/** Utility type to simplify FormApi usage */\nexport type AppFormApi<TValues> = FormApi<TValues, any, any, any, any, any, any, any, any, any>;\n\n/**\n * Utility function to submit a form with a handler that receives the values and the formApi.\n * @param onSubmit - The handler function to call with the values and the formApi.\n * @returns A function that can be used to submit the form. It will filter out disabled fields from the values.\n */\nexport function tfOnSubmit<TValues>(\n onSubmit: ({ values, formApi }: { values: TValues; formApi: AppFormApi<TValues> }) => Promise<any> | any\n) {\n return async ({ formApi }: { formApi: AppFormApi<TValues> }): Promise<any> => {\n const values = pickEnabledFields(formApi.state.values, formApi);\n\n await onSubmit({ values, formApi });\n };\n}\nfunction pickEnabledFields<TValues>(rawValues: TValues, formApi: AppFormApi<TValues>): TValues {\n const result: TValues = {} as TValues;\n\n //TODO: Nested objects are not supported yet\n for (const key in rawValues) {\n const meta = formApi.getFieldMeta(key) as AnyFieldMeta & {\n disabled?: boolean;\n };\n if (!meta?.disabled) {\n result[key] = rawValues[key];\n }\n }\n\n return result;\n}\n\nexport function getFieldErrorMessage(\n field: FieldApi<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>\n): string {\n return field?.state.meta.errors.map(e => e?.message).join(',');\n}\n"],"names":["useTfFieldContext","disabled","field","useFieldContext","React","meta","tfOnSubmit","onSubmit","formApi","values","pickEnabledFields","rawValues","result","key","getFieldErrorMessage","e"],"mappings":"sGAaO,SAASA,EAAqB,CAAE,SAAAC,GAA+B,CAClE,MAAMC,EAAQC,EAAA,EAEd,OAAAC,EAAM,UAAU,IAAM,CAClBF,EAAM,QAAQG,IAAS,CACnB,GAAGA,EACH,SAAU,CAAC,CAACJ,CAAA,EACd,CACN,EAAG,CAACA,EAAUC,CAAK,CAAC,EAEbA,CACX,CAUO,SAASI,EACZC,EACF,CACE,MAAO,OAAO,CAAE,QAAAC,KAA8D,CAC1E,MAAMC,EAASC,EAAkBF,EAAQ,MAAM,OAAQA,CAAO,EAE9D,MAAMD,EAAS,CAAE,OAAAE,EAAQ,QAAAD,EAAS,CACtC,CACJ,CACA,SAASE,EAA2BC,EAAoBH,EAAuC,CAC3F,MAAMI,EAAkB,CAAA,EAGxB,UAAWC,KAAOF,EACDH,EAAQ,aAAaK,CAAG,GAG1B,WACPD,EAAOC,CAAG,EAAIF,EAAUE,CAAG,GAInC,OAAOD,CACX,CAEO,SAASE,EACZZ,EACM,CACN,OAAOA,GAAO,MAAM,KAAK,OAAO,OAASa,GAAG,OAAO,EAAE,KAAK,GAAG,CACjE"}
package/lib/index.css CHANGED
@@ -1,7 +1,239 @@
1
1
  @import 'tailwindcss';
2
- @import 'tw-animate-css';
3
2
  @import './tokens.css';
4
- @import './theme.css' layer(theme);
3
+ /** https://tailwindcss.com/docs/theme#theme-variable-namespaces */
4
+ @theme inline {
5
+ /* Radius */
6
+ --radius-*: initial;
7
+
8
+ /* Text Sizes */
9
+ /* Reset all default text sizes */
10
+ --text-*: initial;
11
+
12
+ /* No shadows needed so far, just don't use them. */
13
+ --shadow-*: initial;
14
+
15
+ /* Colors */
16
+ --color-*: initial;
17
+ --color-primary-1: var(--primary-1);
18
+ --color-primary-2: var(--primary-2);
19
+ --color-primary-3: var(--primary-3);
20
+ --color-primary-4: var(--primary-4);
21
+ --color-primary-5: var(--primary-5);
22
+ --color-primary-6: var(--primary-6);
23
+ --color-primary-7: var(--primary-7);
24
+ --color-primary-8: var(--primary-8);
25
+ --color-primary-9: var(--primary-9);
26
+ --color-primary-10: var(--primary-10);
27
+
28
+ --color-secondary-1: var(--secondary-1);
29
+ --color-secondary-2: var(--secondary-2);
30
+ --color-secondary-3: var(--secondary-3);
31
+ --color-secondary-4: var(--secondary-4);
32
+ --color-secondary-5: var(--secondary-5);
33
+ --color-secondary-6: var(--secondary-6);
34
+ --color-secondary-7: var(--secondary-7);
35
+ --color-secondary-8: var(--secondary-8);
36
+ --color-secondary-9: var(--secondary-9);
37
+ --color-secondary-10: var(--secondary-10);
38
+
39
+ --color-neutral-1: var(--neutral-1);
40
+ --color-neutral-2: var(--neutral-2);
41
+ --color-neutral-3: var(--neutral-3);
42
+ --color-neutral-4: var(--neutral-4);
43
+ --color-neutral-5: var(--neutral-5);
44
+ --color-neutral-6: var(--neutral-6);
45
+ --color-neutral-7: var(--neutral-7);
46
+ --color-neutral-8: var(--neutral-8);
47
+ --color-neutral-9: var(--neutral-9);
48
+ --color-neutral-10: var(--neutral-10);
49
+
50
+ --color-destructive-1: var(--destructive-1);
51
+ --color-destructive-2: var(--destructive-2);
52
+ --color-destructive-3: var(--destructive-3);
53
+ --color-destructive-4: var(--destructive-4);
54
+ --color-destructive-5: var(--destructive-5);
55
+ --color-destructive-6: var(--destructive-6);
56
+ --color-destructive-7: var(--destructive-7);
57
+ --color-destructive-8: var(--destructive-8);
58
+ --color-destructive-9: var(--destructive-9);
59
+ --color-destructive-10: var(--destructive-10);
60
+
61
+ --color-success-1: var(--success-1);
62
+ --color-success-2: var(--success-2);
63
+ --color-success-3: var(--success-3);
64
+ --color-success-4: var(--success-4);
65
+ --color-success-5: var(--success-5);
66
+ --color-success-6: var(--success-6);
67
+ --color-success-7: var(--success-7);
68
+ --color-success-8: var(--success-8);
69
+ --color-success-9: var(--success-9);
70
+ --color-success-10: var(--success-10);
71
+
72
+ --color-background: var(--color-neutral-3);
73
+ --color-elevation-1: var(--color-neutral-2);
74
+ --color-elevation-2: var(--color-neutral-1);
75
+
76
+ --color-foreground: var(--color-neutral-8);
77
+ --color-card: var(--color-elevation-1);
78
+ --color-card-foreground: var(--color-foreground);
79
+ /* Assuming popovers only show up over cards ??? */
80
+ --color-popover: var(--color-elevation-2);
81
+ --color-popover-foreground: var(--color-foreground);
82
+
83
+ --color-primary: var(--color-primary-7);
84
+ --color-primary-foreground: var(--color-primary-2);
85
+ --color-secondary: var(--color-secondary-7);
86
+ --color-secondary-foreground: var(--color-secondary-2);
87
+ --color-muted: var(--color-neutral-7);
88
+ --color-muted-foreground: var(--color-neutral-4);
89
+ --color-accent: var(--color-neutral-7);
90
+ --color-accent-foreground: var(--color-neutral-4);
91
+ --color-destructive: var(--color-destructive-7);
92
+ --color-destructive-foreground: var(--color-destructive-2);
93
+ --color-success: var(--color-success-7);
94
+ --color-success-foreground: var(--color-success-2);
95
+
96
+ --color-border: var(--color-neutral-4);
97
+ --color-input: var(--color-border);
98
+ --color-ring: var(--color-neutral-5);
99
+
100
+ --color-chart-1: var(--color-primary-5);
101
+ --color-chart-2: var(--color-primary-4);
102
+ --color-chart-3: var(--color-secondary-5);
103
+ --color-chart-4: var(--color-secondary-4);
104
+ --color-chart-5: var(--color-secondary-2);
105
+
106
+ --color-sidebar-background: var(--color-elevation-1);
107
+ --color-sidebar-foreground: var(--color-foreground);
108
+
109
+ --spacing-input: --spacing(8);
110
+ --spacing-icon: --spacing(4);
111
+ --spacing-table: --spacing(100);
112
+
113
+ --sidebar-width: var(--container-3xs);
114
+ --sidebar-width-mobile: var(--container-2xs);
115
+ --sidebar-width-icon: --spacing(12);
116
+
117
+ /* Header nav */
118
+ --spacing-header: --spacing(12);
119
+ /* Helper for using sidebar with header */
120
+ --spacing-sidebar: calc(100svh - var(--spacing-header));
121
+
122
+ /* Minimum length for fluid grid containers */
123
+ --fluid-grid-min: var(--container-3xs);
124
+ }
125
+
126
+ @import 'tw-animate-css';
5
127
  @import 'tw-type-css';
6
- @import './utilities.css';
7
- @import './base.css';
128
+
129
+ @utility link {
130
+ @apply text-primary/70 focus:text-primary hover:text-primary;
131
+ }
132
+
133
+ /* Fluid grid with minimum width */
134
+ @utility grid-fluid {
135
+ @apply grid grid-cols-[repeat(auto-fill,_minmax(var(--fluid-grid-min),_1fr))] gap-icon;
136
+ }
137
+
138
+ @utility focus-ring {
139
+ @apply data-[focus-visible]:outline-none focus-visible:outline-none data-[focus-visible]:ring-1 data-[focus-visible]:ring-ring data-[focus-visible]:ring-offset-2 focus-visible:outline-hidden focus-visible:ring-offset-2 focus-visible:ring-1 focus-visible:ring-ring;
140
+ }
141
+
142
+ @utility disabled-muted {
143
+ @apply disabled:cursor-not-allowed disabled:opacity-70 aria-disabled:cursor-not-allowed aria-disabled:opacity-70 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none data-[disabled]:opacity-70;
144
+ }
145
+ @utility input {
146
+ @apply border border-input bg-popover px-icon py-2 body-sm placeholder:text-muted-foreground disabled-muted focus-ring;
147
+ }
148
+
149
+ /* A base set of classes for elements that can be clicked */
150
+ @utility btn {
151
+ @apply inline-flex gap-1 data-[disabled]:pointer-events-none text-ellipsis overflow-hidden items-center justify-center font-medium transition-colors cursor-pointer ring-offset-background [&_svg:not([class*='size-'])]:size-icon shrink-0 [&_svg]:shrink-0 leading-none outline-none no-underline whitespace-nowrap select-none disabled-muted focus-ring;
152
+ }
153
+
154
+ @utility btn-link {
155
+ @apply btn-ghost underline underline-offset-2;
156
+ }
157
+ @utility btn-primary {
158
+ @apply border border-primary text-primary bg-primary/10 hover:bg-primary/20 data-[hovered]:bg-primary/20 focus:bg-primary/20 data-[focused]:bg-primary/20;
159
+ }
160
+ @utility btn-destructive {
161
+ @apply border border-destructive text-destructive bg-destructive/10 hover:bg-destructive/20 data-[hovered]:bg-destructive/20 focus:bg-destructive/20 data-[focused]:bg-destructive/20;
162
+ }
163
+ @utility btn-neutral {
164
+ @apply border border-input text-accent bg-accent/10 hover:bg-accent/20 data-[hovered]:bg-accent/20 focus:bg-accent/20 data-[focused]:bg-accent/20;
165
+ }
166
+ @utility btn-secondary {
167
+ @apply border border-secondary text-secondary bg-secondary/10 hover:bg-secondary/20 data-[hovered]:bg-secondary/20 focus:bg-secondary/20 data-[focused]:bg-secondary/20;
168
+ }
169
+ @utility btn-ghost {
170
+ @apply bg-transparent focus:bg-accent/20 data-[focused]:bg-accent/20 hover:bg-accent/20 data-[hovered]:bg-accent/20;
171
+ }
172
+ @utility btn-tab {
173
+ @apply truncate btn btn-ghost input-dim font-normal text-accent justify-start data-[selected=true]:bg-primary/20 data-[selected=true]:font-medium data-[selected=true]:text-primary;
174
+ }
175
+ /* Dimensions for a standard input */
176
+ @utility input-dim {
177
+ @apply h-input px-icon py-2 body-sm leading-none;
178
+ }
179
+
180
+ @utility form-column {
181
+ @apply flex flex-col gap-input;
182
+ }
183
+
184
+ @utility form-field {
185
+ @apply flex flex-col gap-1;
186
+ }
187
+
188
+ @utility steps {
189
+ @apply ps-0;
190
+ > ol {
191
+ counter-reset: steps-counter;
192
+ @apply list-none ps-0;
193
+ }
194
+
195
+ > ol > li {
196
+ counter-increment: steps-counter;
197
+ @apply relative ps-input pb-2 min-h-12 list-none;
198
+ }
199
+ > ol > li + li {
200
+ @apply mt-0;
201
+ }
202
+ > ol > li::before {
203
+ content: counter(steps-counter);
204
+ @apply absolute top-0 start-0 size-icon leading-icon bg-accent text-accent-foreground body-sm font-semibold text-center rounded-full;
205
+ }
206
+ > ol > li::after {
207
+ content: '';
208
+ @apply absolute bg-border w-[1px] top-5 h-1/2 left-2 py-1;
209
+ }
210
+ > ol > li:last-child::after {
211
+ @apply content-none;
212
+ }
213
+ }
214
+
215
+ @layer base {
216
+ * {
217
+ @apply border-border outline-ring/50;
218
+ }
219
+
220
+ body {
221
+ @apply bg-background text-foreground;
222
+ }
223
+
224
+ .tw-prose a {
225
+ @apply link;
226
+ }
227
+
228
+ *::-webkit-scrollbar {
229
+ @apply size-2;
230
+ }
231
+
232
+ *::-webkit-scrollbar-track {
233
+ @apply bg-card rounded-none;
234
+ }
235
+
236
+ *::-webkit-scrollbar-thumb {
237
+ @apply bg-foreground/70 hover:bg-foreground;
238
+ }
239
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cryptlex/web-components",
3
- "version": "6.6.6-alpha05",
3
+ "version": "6.6.6-alpha08",
4
4
  "description": "React component library for Cryptlex web applications",
5
5
  "author": "Cryptlex",
6
6
  "type": "module",
@@ -49,7 +49,7 @@
49
49
  "@dnd-kit/core": "6.3.1",
50
50
  "@dnd-kit/sortable": "10.0.0",
51
51
  "@dnd-kit/utilities": "3.2.2",
52
- "@internationalized/date": "3.8.2",
52
+ "@internationalized/date": "3.9.0",
53
53
  "@tanstack/react-form": "1.6.3",
54
54
  "@tanstack/react-query": "5.62.3",
55
55
  "@tanstack/react-table": "8.20.5",
@@ -61,10 +61,9 @@
61
61
  "lodash-es": "4.17.21",
62
62
  "openapi-fetch": "0.14.0",
63
63
  "react": "^19.1.0",
64
- "react-aria-components": "1.11.0",
64
+ "react-aria-components": "1.12.0",
65
65
  "react-dom": "^19.1.0",
66
66
  "recharts": "2.15.3",
67
- "sonner": "1.7.0",
68
67
  "tailwindcss": "4.1.12",
69
68
  "tw-animate-css": "1.3.0",
70
69
  "tw-type-css": "0.0.1",
@@ -72,12 +71,13 @@
72
71
  },
73
72
  "devDependencies": {
74
73
  "@rollup/plugin-node-resolve": "16.0.1",
75
- "@storybook/addon-a11y": "9.1.3",
76
- "@storybook/addon-docs": "9.1.3",
77
- "@storybook/addon-links": "9.1.3",
78
- "@storybook/addon-onboarding": "9.1.3",
79
- "@storybook/addon-vitest": "9.1.3",
80
- "@storybook/react-vite": "9.1.3",
74
+ "@storybook/addon-a11y": "9.1.4",
75
+ "@storybook/addon-docs": "9.1.4",
76
+ "@storybook/addon-links": "9.1.4",
77
+ "@storybook/addon-onboarding": "9.1.4",
78
+ "@storybook/addon-vitest": "9.1.4",
79
+ "@storybook/react-vite": "9.1.4",
80
+ "@tailwindcss/cli": "4.1.12",
81
81
  "@tailwindcss/vite": "4.1.12",
82
82
  "@types/node": "^22.7.8",
83
83
  "@types/react": "^19.1.0",
@@ -87,22 +87,20 @@
87
87
  "@vitest/coverage-v8": "^3.2.4",
88
88
  "husky": "^9.1.7",
89
89
  "lint-staged": "^16.1.4",
90
- "lucide-react": "0.453.0",
90
+ "lucide-react": "0.541.0",
91
91
  "playwright": "^1.55.0",
92
92
  "prettier": "3.6.2",
93
93
  "rollup-preserve-directives": "1.1.3",
94
- "sass": "1.80.6",
95
- "storybook": "9.1.3",
96
- "typescript": "5.8.3",
97
- "typescript-eslint": "8.38.0",
98
- "vite": "7.0.6",
94
+ "sass": "1.89.2",
95
+ "storybook": "9.1.4",
96
+ "typescript": "5.9.2",
97
+ "vite": "7.1.4",
99
98
  "vite-plugin-dts": "4.5.4",
100
99
  "vite-tsconfig-paths": "5.1.4",
101
100
  "vitest": "^3.2.4"
102
101
  },
103
102
  "scripts": {
104
103
  "build": "tsc && vite build",
105
- "lint": "eslint .",
106
104
  "storybook": "storybook dev -p 6006 --no-open",
107
105
  "build:storybook": "storybook build",
108
106
  "build:tokens": "sass --no-source-map ./lib/tokens.scss ./lib/tokens.css",
@@ -1,4 +0,0 @@
1
- import { Toaster as Sonner } from 'sonner';
2
- type ToasterProps = React.ComponentProps<typeof Sonner>;
3
- export declare function Toaster({ ...props }: ToasterProps): import("react/jsx-runtime").JSX.Element;
4
- export {};
@@ -1,2 +0,0 @@
1
- "use client";import{jsx as o}from"react/jsx-runtime";import{Toaster as r}from"sonner";function s({...t}){return o(r,{className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...t})}export{s as Toaster};
2
- //# sourceMappingURL=sonner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sonner.js","sources":["../../lib/components/sonner.tsx"],"sourcesContent":["'use client';\nimport { Toaster as Sonner } from 'sonner';\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\n// TODO, this doesn't conform to our styles\nexport function Toaster({ ...props }: ToasterProps) {\n return (\n <Sonner\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast: 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n );\n}\n"],"names":["Toaster","props","jsx","Sonner"],"mappings":"sFAMO,SAASA,EAAQ,CAAE,GAAGC,GAAuB,CAChD,OACIC,EAACC,EAAA,CACG,UAAU,gBACV,aAAc,CACV,WAAY,CACR,MAAO,6GACP,YAAa,uCACb,aAAc,mEACd,aAAc,8DAAA,CAClB,EAEH,GAAGF,CAAA,CAAA,CAGhB"}
package/lib/base.css DELETED
@@ -1,25 +0,0 @@
1
- @layer base {
2
- * {
3
- @apply border-border outline-ring/50;
4
- }
5
-
6
- body {
7
- @apply bg-background text-foreground;
8
- }
9
-
10
- .tw-prose a {
11
- @apply link;
12
- }
13
-
14
- *::-webkit-scrollbar {
15
- @apply size-2;
16
- }
17
-
18
- *::-webkit-scrollbar-track {
19
- @apply bg-card rounded-none;
20
- }
21
-
22
- *::-webkit-scrollbar-thumb {
23
- @apply bg-foreground/70 hover:bg-foreground;
24
- }
25
- }
package/lib/theme.css DELETED
@@ -1,122 +0,0 @@
1
- /** https://tailwindcss.com/docs/theme#theme-variable-namespaces */
2
- @theme {
3
- /* Radius */
4
- --radius-*: initial;
5
-
6
- /* Text Sizes */
7
- /* Reset all default text sizes */
8
- --text-*: initial;
9
-
10
- /* No shadows needed so far, just don't use them. */
11
- --shadow-*: initial;
12
-
13
- /* Colors */
14
- --color-*: initial;
15
- --color-primary-1: var(--primary-1);
16
- --color-primary-2: var(--primary-2);
17
- --color-primary-3: var(--primary-3);
18
- --color-primary-4: var(--primary-4);
19
- --color-primary-5: var(--primary-5);
20
- --color-primary-6: var(--primary-6);
21
- --color-primary-7: var(--primary-7);
22
- --color-primary-8: var(--primary-8);
23
- --color-primary-9: var(--primary-9);
24
- --color-primary-10: var(--primary-10);
25
-
26
- --color-secondary-1: var(--secondary-1);
27
- --color-secondary-2: var(--secondary-2);
28
- --color-secondary-3: var(--secondary-3);
29
- --color-secondary-4: var(--secondary-4);
30
- --color-secondary-5: var(--secondary-5);
31
- --color-secondary-6: var(--secondary-6);
32
- --color-secondary-7: var(--secondary-7);
33
- --color-secondary-8: var(--secondary-8);
34
- --color-secondary-9: var(--secondary-9);
35
- --color-secondary-10: var(--secondary-10);
36
-
37
- --color-neutral-1: var(--neutral-1);
38
- --color-neutral-2: var(--neutral-2);
39
- --color-neutral-3: var(--neutral-3);
40
- --color-neutral-4: var(--neutral-4);
41
- --color-neutral-5: var(--neutral-5);
42
- --color-neutral-6: var(--neutral-6);
43
- --color-neutral-7: var(--neutral-7);
44
- --color-neutral-8: var(--neutral-8);
45
- --color-neutral-9: var(--neutral-9);
46
- --color-neutral-10: var(--neutral-10);
47
-
48
- --color-destructive-1: var(--destructive-1);
49
- --color-destructive-2: var(--destructive-2);
50
- --color-destructive-3: var(--destructive-3);
51
- --color-destructive-4: var(--destructive-4);
52
- --color-destructive-5: var(--destructive-5);
53
- --color-destructive-6: var(--destructive-6);
54
- --color-destructive-7: var(--destructive-7);
55
- --color-destructive-8: var(--destructive-8);
56
- --color-destructive-9: var(--destructive-9);
57
- --color-destructive-10: var(--destructive-10);
58
-
59
- --color-success-1: var(--success-1);
60
- --color-success-2: var(--success-2);
61
- --color-success-3: var(--success-3);
62
- --color-success-4: var(--success-4);
63
- --color-success-5: var(--success-5);
64
- --color-success-6: var(--success-6);
65
- --color-success-7: var(--success-7);
66
- --color-success-8: var(--success-8);
67
- --color-success-9: var(--success-9);
68
- --color-success-10: var(--success-10);
69
-
70
- --color-background: var(--color-neutral-3);
71
- --color-elevation-1: var(--color-neutral-2);
72
- --color-elevation-2: var(--color-neutral-1);
73
-
74
- --color-foreground: var(--color-neutral-8);
75
- --color-card: var(--color-elevation-1);
76
- --color-card-foreground: var(--color-foreground);
77
- /* Assuming popovers only show up over cards ??? */
78
- --color-popover: var(--color-elevation-2);
79
- --color-popover-foreground: var(--color-foreground);
80
-
81
- --color-primary: var(--color-primary-7);
82
- --color-primary-foreground: var(--color-primary-2);
83
- --color-secondary: var(--color-secondary-7);
84
- --color-secondary-foreground: var(--color-secondary-2);
85
- --color-muted: var(--color-neutral-7);
86
- --color-muted-foreground: var(--color-neutral-4);
87
- --color-accent: var(--color-neutral-7);
88
- --color-accent-foreground: var(--color-neutral-4);
89
- --color-destructive: var(--color-destructive-7);
90
- --color-destructive-foreground: var(--color-destructive-2);
91
- --color-success: var(--color-success-7);
92
- --color-success-foreground: var(--color-success-2);
93
-
94
- --color-border: var(--color-neutral-4);
95
- --color-input: var(--color-border);
96
- --color-ring: var(--color-neutral-5);
97
-
98
- --color-chart-1: var(--color-primary-5);
99
- --color-chart-2: var(--color-primary-4);
100
- --color-chart-3: var(--color-secondary-5);
101
- --color-chart-4: var(--color-secondary-4);
102
- --color-chart-5: var(--color-secondary-2);
103
-
104
- --color-sidebar-background: var(--color-elevation-1);
105
- --color-sidebar-foreground: var(--color-foreground);
106
-
107
- --spacing-input: calc(var(--spacing) * 8);
108
- --spacing-icon: calc(var(--spacing-input) / 2);
109
- --spacing-table: calc(var(--spacing) * 100);
110
-
111
- --sidebar-width: var(--container-3xs);
112
- --sidebar-width-mobile: var(--container-2xs);
113
- --sidebar-width-icon: var(--spacing(12));
114
-
115
- /* Header nav */
116
- --spacing-header: calc(var(--spacing) * 12);
117
- /* Helper for using sidebar with header */
118
- --spacing-sidebar: calc(100svh - var(--spacing-header));
119
-
120
- /* Minimum length for fluid grid containers */
121
- --fluid-grid-min: var(--container-3xs);
122
- }
package/lib/utilities.css DELETED
@@ -1,85 +0,0 @@
1
- @utility link {
2
- @apply text-primary/70 focus:text-primary hover:text-primary;
3
- }
4
-
5
- /* Fluid grid with minimum width */
6
- @utility grid-fluid {
7
- @apply grid grid-cols-[repeat(auto-fill,_minmax(var(--fluid-grid-min),_1fr))] gap-icon;
8
- }
9
-
10
- @utility focus-ring {
11
- @apply data-[focus-visible]:outline-none focus-visible:outline-none data-[focus-visible]:ring-1 data-[focus-visible]:ring-ring data-[focus-visible]:ring-offset-2 focus-visible:outline-hidden focus-visible:ring-offset-2 focus-visible:ring-1 focus-visible:ring-ring;
12
- }
13
-
14
- @utility disabled-muted {
15
- @apply disabled:cursor-not-allowed disabled:opacity-70 aria-disabled:cursor-not-allowed aria-disabled:opacity-70 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none data-[disabled]:opacity-70;
16
- }
17
- @utility input {
18
- @apply border border-input bg-popover px-icon py-2 body-sm placeholder:text-muted-foreground disabled-muted focus-ring;
19
- }
20
-
21
- /* A base set of classes for elements that can be clicked */
22
- @utility btn {
23
- @apply inline-flex gap-1 data-[disabled]:pointer-events-none text-ellipsis overflow-hidden items-center justify-center font-medium transition-colors cursor-pointer ring-offset-background [&_svg:not([class*='size-'])]:size-icon shrink-0 [&_svg]:shrink-0 leading-none outline-none no-underline whitespace-nowrap select-none disabled-muted focus-ring;
24
- }
25
-
26
- @utility btn-link {
27
- @apply btn-ghost underline underline-offset-2;
28
- }
29
- @utility btn-primary {
30
- @apply border border-primary text-primary bg-primary/10 hover:bg-primary/20 data-[hovered]:bg-primary/20 focus:bg-primary/20 data-[focused]:bg-primary/20;
31
- }
32
- @utility btn-destructive {
33
- @apply border border-destructive text-destructive bg-destructive/10 hover:bg-destructive/20 data-[hovered]:bg-destructive/20 focus:bg-destructive/20 data-[focused]:bg-destructive/20;
34
- }
35
- @utility btn-neutral {
36
- @apply border border-input text-accent bg-accent/10 hover:bg-accent/20 data-[hovered]:bg-accent/20 focus:bg-accent/20 data-[focused]:bg-accent/20;
37
- }
38
- @utility btn-secondary {
39
- @apply border border-secondary text-secondary bg-secondary/10 hover:bg-secondary/20 data-[hovered]:bg-secondary/20 focus:bg-secondary/20 data-[focused]:bg-secondary/20;
40
- }
41
- @utility btn-ghost {
42
- @apply bg-transparent focus:bg-accent/20 data-[focused]:bg-accent/20 hover:bg-accent/20 data-[hovered]:bg-accent/20;
43
- }
44
- @utility btn-tab {
45
- @apply truncate btn btn-ghost input-dim font-normal text-accent justify-start data-[selected=true]:bg-primary/20 data-[selected=true]:font-medium data-[selected=true]:text-primary;
46
- }
47
- /* Dimensions for a standard input */
48
- @utility input-dim {
49
- @apply h-input px-icon py-2 body-sm leading-none;
50
- }
51
-
52
- @utility form-column {
53
- @apply flex flex-col gap-input;
54
- }
55
-
56
- @utility form-field {
57
- @apply flex flex-col gap-1;
58
- }
59
-
60
- @utility steps {
61
- @apply ps-0;
62
- > ol {
63
- counter-reset: steps-counter;
64
- @apply list-none ps-0;
65
- }
66
-
67
- > ol > li {
68
- counter-increment: steps-counter;
69
- @apply relative ps-input pb-2 min-h-12 list-none;
70
- }
71
- > ol > li + li {
72
- @apply mt-0;
73
- }
74
- > ol > li::before {
75
- content: counter(steps-counter);
76
- @apply absolute top-0 start-0 size-icon leading-icon bg-accent text-accent-foreground body-sm font-semibold text-center rounded-full;
77
- }
78
- > ol > li::after {
79
- content: '';
80
- @apply absolute bg-border w-[1px] top-5 h-1/2 left-2 py-1;
81
- }
82
- > ol > li:last-child::after {
83
- @apply content-none;
84
- }
85
- }