@dextinity/ui 0.0.0-stage → 11.0.0-canary-20261029073435

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/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2023, Vivid Planet Software GmbH
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md CHANGED
@@ -1,3 +1,191 @@
1
- # Temporary Holding Version
1
+ # @dextinity/ui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ An **experimental**, UI-only React component library. It contains no routing, forms, data fetching, or other non-UI logic, and it is not specific to the admin: any React application can use it.
4
+
5
+ It builds on an unstyled foundation rather than evolving the MUI-based components of `@dextinity/admin`; `@base-ui/react` is the chosen foundation.
6
+
7
+ ## Usage
8
+
9
+ Import the styles once, in the application's entry file:
10
+
11
+ ```ts
12
+ import "@dextinity/ui/css";
13
+ ```
14
+
15
+ ## Experimental
16
+
17
+ Any export may change or be removed at any time, without deprecation notice. Changesets are not created for changes within this package.
18
+
19
+ ## Non-goals
20
+
21
+ - **No non-UI logic.** Forms (`final-form`, `react-hook-form`), routing (`react-router`), data fetching (Apollo), and similar concerns stay out.
22
+ - **No dependency on `@mui/material`, `@mui/system`, Emotion, or any other part of the existing `@dextinity/admin` styling stack.** This package is a fresh foundation; cross-imports reintroduce the competing system it removes.
23
+
24
+ ## Folder and file names
25
+
26
+ - **Feature folders** use camelCase (`button/`, `textField/`).
27
+ - **Component file**: `<ComponentName>.tsx` (PascalCase), one per component feature.
28
+ - **Non-component code file**: `<featureName>.ts(x)` (camelCase) for utilities and hooks.
29
+ - **Styles**: `<ComponentName>.module.scss` (CSS Modules with SCSS).
30
+
31
+ ## Component conventions
32
+
33
+ ### Exports
34
+
35
+ - Props are exported as an interface named `<ComponentName>Props`, never a type alias.
36
+ - The resolved configuration is exported as a type named `<ComponentName>OwnerState`.
37
+ - The component is exported as `<ComponentName>`.
38
+
39
+ ### TSDoc
40
+
41
+ Components and utilities are documented in TSDoc on the export itself, so the docs ship with the package, get picked up by Storybook, and stay next to the code.
42
+
43
+ Keep each comment as close as possible to what it describes: the component comment says what the component is for, while a prop's description and its `@defaultValue` go on the prop. Say what a feature does, not how (leave out the rendered element, prop forwarding, the base-ui foundation) and not why (the commit carries that); don't merely restate the name. Keep it as short as the feature allows. The shared override-API members — `className`, `slots`, `slotProps`, and the `OwnerState` type — share the wording shown below, extended only where a component needs more detail.
44
+
45
+ ```tsx
46
+ /**
47
+ * Buttons allow users to take actions, and make choices, with a single tap.
48
+ */
49
+ export function Button(props: ButtonProps) {
50
+ // ...
51
+ }
52
+
53
+ /**
54
+ * The resolved configuration that influences the component's appearance or behavior.
55
+ */
56
+ export type ButtonOwnerState = {
57
+ variant: "primary" | "secondary";
58
+ disabled: boolean;
59
+ };
60
+
61
+ export interface ButtonProps {
62
+ /**
63
+ * Use `primary` only for the single main action on a page, dialog, etc.
64
+ *
65
+ * @defaultValue `"primary"`
66
+ */
67
+ variant?: "primary" | "secondary";
68
+ /** Added alongside the component's own classes. */
69
+ className?: string;
70
+ /** Sets which element a named inner part renders as. */
71
+ slots?: ButtonSlots;
72
+ /** Props for each slot, merged with the slot's own props rather than replacing them. */
73
+ slotProps?: ButtonSlotProps;
74
+ }
75
+ ```
76
+
77
+ A change that makes a comment inaccurate updates it in the same change.
78
+
79
+ ### Root element props
80
+
81
+ A component extends the props of its root element and passes the ones it doesn't handle itself to that element, so a consumer can set any attribute or event handler the root element accepts without us maintaining a dedicated prop for each. By default it doesn't re-declare or document them; they stay as the root element defines them. It may still re-declare one to support it as a documented feature.
82
+
83
+ ### Override props
84
+
85
+ The exported components share one set of override props; each offers the ones that apply to it. The [styling contract](#styling-contract) is the primary way to style a component; these props do what it can't — place and swap inner parts, and set or vary their props.
86
+
87
+ - **`className`** — a string, merged with the contract classes, never replacing them. It is not a function: every value in `ownerState` already emits a `data-*` attribute, so an `ownerState`-dependent class would add nothing.
88
+ - **`slots`** — sets which element a named inner part renders as. The root is not a slot — it is the component's own outermost element, configured through the component's top-level props directly (`className`, event handlers, ARIA, …).
89
+ - **`slotProps`** — props for those same inner parts, as an object **or** a function of `ownerState`. Their type follows the element chosen for the slot in `slots`, and falls back to the slot's default element when `slots` is omitted. They are merged with the component's own props, so a contract class or handler is never dropped.
90
+ - **`ownerState`** — one object per component: the resolved configuration (`variant`, `disabled`, …) that influences the component's appearance or behavior; the root's `data-*` attributes are derived from it. It holds no transient interaction state (hover/press/focus).
91
+
92
+ A slot accepts any element only while the component injects nothing element-specific into it — a universal prop like `className` is fine, `href` is not. When the component injects an element-specific prop, the slot narrows to the elements that accept it — a minimum prop contract any intrinsic element or custom component can satisfy. A part limited for semantic reasons instead — a heading restricted to `h1`–`h6` — takes a fixed set of allowed elements.
93
+
94
+ ### Styling contract
95
+
96
+ Every component emits a stable, predictable contract for consumer styling: a consumer writes plain CSS against it, with no React API involvement required. It is part of the public API — renaming an emitted class or `data-*` attribute is a breaking change.
97
+
98
+ The contract has two parts: **structural class names** for a component's elements, and **owner-state styling** for the resolved configuration, expressed as `data-*` attributes.
99
+
100
+ **Structural class names** identify a component's root and its parts:
101
+
102
+ - **Root** — `dextinity<Component>`. The outermost element of a component, camelCased. Examples: `dextinityButton`, `dextinityTextField`.
103
+ - **Parts** — `dextinity<Component>__<partName>`. A part is a named sub-element; the part name is camelCased. Examples: `dextinityButton__startIcon`, `dextinityTextField__label`.
104
+
105
+ **Owner-state styling** uses `data-*` attributes on the root element, following base-ui's own conversion of an owner-state object:
106
+
107
+ - **Enum state** → a single valued attribute: `data-variant="primary"`.
108
+ - **Boolean state** → presence only: `data-disabled` (absent when false).
109
+ - The attribute name is `data-` + the lowercased owner-state key. Owner-state keys are single lowercase words, so the name needs no kebab-casing.
110
+
111
+ **Emission.** These attributes cover owner-state values only; parts are class names. How a component emits them depends on its foundation: one rendered through `useRender` passes `state: ownerState` for base-ui to convert; one built on a base-ui primitive lets the primitive emit the state it owns and passes the rest inline (`data-variant={variant}`).
112
+
113
+ **Composition.** When a component of this package is used as the root of another component, both root classes appear on the same element — a `CustomButton` rendering through `Button` produces `dextinityButton dextinityCustomButton`. Either layer is targetable.
114
+
115
+ **Authoring source.** The SCSS module's local class names match the public part names; the stylesheet's file name is the single source of a component's emitted name. The mapping:
116
+
117
+ | Source local | Emitted DOM class |
118
+ | ------------ | ---------------------------- |
119
+ | `root` | `dextinityButton` |
120
+ | `startIcon` | `dextinityButton__startIcon` |
121
+
122
+ - A component with no single dominant element names no class `root`.
123
+ - Owner-state styles use attribute selectors nested under `.root` with `&` (`.root { &[data-variant="primary"] { … } }`).
124
+
125
+ ### Stories
126
+
127
+ Stories live under the "Components" section. Each consumer-facing component has its own story file in an `__stories__/` directory next to its source; story-only helpers such as decorators live in [`src/storybook/`](src/storybook). The component's TSDoc and prop table (see [TSDoc](#tsdoc)) drive its autodocs page, so stories don't restate it.
128
+
129
+ #### Main story
130
+
131
+ `__stories__/<ComponentName>.stories.tsx`, included in autodocs, is the component's consumer-facing documentation: a new variant, feature, or state gets a story in the same change, keeping the docs page current.
132
+
133
+ Stories use [Component Story Format 3](https://storybook.js.org/docs/api/csf), typed with `satisfies` so `meta` is checked against the component's props and each story inherits its args:
134
+
135
+ ```tsx
136
+ const meta = {
137
+ component: Button,
138
+ args: { children: "Button", onClick: fn() },
139
+ } satisfies Meta<typeof Button>;
140
+
141
+ export default meta;
142
+
143
+ type Story = StoryObj<typeof meta>;
144
+ ```
145
+
146
+ `meta.args` holds only what a practical example needs: required content such as `children`, and the event handlers that make it interactive. It omits any prop that has a component default — a defaulted prop is set in the story that demonstrates it instead.
147
+
148
+ The first story is `Default`, the autodocs example: it sets no args of its own, showing that smallest practical example. Each prop that changes the component visibly then gets one story per option; a prop that changes only semantics, such as `Typography`'s `element`, stays a control, since a story per value would look the same.
149
+
150
+ Each declared prop is exposed as a control through `argTypes`, by kind:
151
+
152
+ - **Boolean** — a toggle.
153
+ - **Enum** — `radio` for three options or fewer, `select` for more.
154
+ - **`ReactNode`** — a `select` whose `options` are labels and whose `mapping` resolves each to the node. The built-in empty choice covers the unset case.
155
+ - **Override-API props** (`className`, `slots`, `slotProps`, `ref`, `render`) — `control: false`, keeping the prop-table row without an unusable control.
156
+ - **Event handlers** — `fn()` from `storybook/test`, so calls show in the Actions panel and an interaction test can verify the handler ran.
157
+
158
+ #### Dev story
159
+
160
+ `__stories__/<name>.dev.stories.tsx`, optional, nests its title under a `Dev` segment (`Components/<Component>/Dev/<Name>`) and sets `tags: ["!autodocs"]` in its meta, keeping these out of the consumer docs. A dev story serves any development, testing, or debugging need, so add them freely — e.g. reproduce a bug in a dev story and use it to confirm the fix, rather than reaching for the Dextinity demo or a consuming project.
161
+
162
+ ## Testing
163
+
164
+ Test the behavior and contracts a consumer depends on, not the implementation. Each test protects one such behavior; anything written only for coverage, or that just restates the type checker or the implementation, is left out.
165
+
166
+ What to test, and with which kind of test:
167
+
168
+ - **Utility logic** — a unit test (`unit` project, `jsdom`) next to the utility, exercising it directly in isolation.
169
+ - **A component's render contract** — the class names and `data-*` attributes consumers style and target — a unit test next to the component. Assert the contract, not the styles it produces.
170
+ - **A type-only contract** — typing with no runtime behavior, such as slot-prop inference — a compile-time test (`@ts-expect-error` on what must not compile), caught by `tsc`.
171
+ - **Component behavior** — click, keyboard, focus, disabled — a Storybook interaction test (a story's `play` function), run in a real browser.
172
+
173
+ Not worth a test:
174
+
175
+ - **That a component renders** — every story already runs as a browser test, so a rendering story is the coverage.
176
+ - **Appearance** — colors, sizes, spacing — reviewed visually in the stories, never asserted.
177
+ - **Dev-local tooling** — story-only helpers — a failure is loud and local. Exception: code whose regression is silent or reaches consumers, such as the class-name mapping in `src/cssModules/`.
178
+
179
+ Run from `packages/ui`: `pnpm run test:unit`, `pnpm run test:storybook`, and `pnpm run test:watch`.
180
+
181
+ ## Theme
182
+
183
+ Components read their colors and metrics from CSS custom properties (`var(--dextinity-button-…)`, `var(--dextinity-color-…)`, `var(--dextinity-typography-…)`) with **no fallback** — an unthemed component renders visibly unstyled rather than silently drifting to a default. There is no runtime JS theme object.
184
+
185
+ ### Token layers
186
+
187
+ The tokens are defined in five SCSS partials under [`src/theme/`](src/theme), composed into the provider module with `@use` and wrapped in a single `@layer dextinity`: `_primitives.scss` (raw values, internal), `_brand.scss`, `_responsive.scss`, `_semantic.scss`, and `_components.scss`. The prop-value types live in [`src/theme/types.ts`](src/theme/types.ts).
188
+
189
+ ### Selecting a color scheme
190
+
191
+ `Theme` selects the active color scheme. It stays a pure function of its props — reading no `window`, `localStorage`, or `matchMedia` — so it renders the same on server and client; switching, OS-scheme resolution, and preventing the first-paint flash on SSR stay in consumer code.
@@ -0,0 +1,60 @@
1
+ import { Button as BaseButton } from "@base-ui/react/button";
2
+ import type { ElementType, ReactNode } from "react";
3
+ import { type SlotPropsValue } from "../../utils/slotProps";
4
+ type ButtonVariant = "primary" | "secondary";
5
+ /**
6
+ * The resolved configuration that influences the component's appearance or behavior.
7
+ */
8
+ export type ButtonOwnerState = {
9
+ variant: ButtonVariant;
10
+ disabled: boolean;
11
+ };
12
+ interface ButtonSlots<StartIcon extends ElementType, EndIcon extends ElementType> {
13
+ /**
14
+ * Element for the `startIcon` slot.
15
+ *
16
+ * @defaultValue `span`
17
+ */
18
+ startIcon?: StartIcon;
19
+ /**
20
+ * Element for the `endIcon` slot.
21
+ *
22
+ * @defaultValue `span`
23
+ */
24
+ endIcon?: EndIcon;
25
+ }
26
+ interface ButtonSlotProps<StartIcon extends ElementType, EndIcon extends ElementType> {
27
+ /** Props for the `startIcon` slot. */
28
+ startIcon?: SlotPropsValue<ButtonOwnerState, StartIcon>;
29
+ /** Props for the `endIcon` slot. */
30
+ endIcon?: SlotPropsValue<ButtonOwnerState, EndIcon>;
31
+ }
32
+ export interface ButtonProps<StartIcon extends ElementType = "span", EndIcon extends ElementType = "span"> extends Omit<BaseButton.Props, "className"> {
33
+ /**
34
+ * Visual style.
35
+ *
36
+ * @defaultValue `"primary"`
37
+ */
38
+ variant?: ButtonVariant;
39
+ /**
40
+ * Prevents interaction with the button.
41
+ *
42
+ * @defaultValue `false`
43
+ */
44
+ disabled?: boolean;
45
+ /** Added alongside the component's own classes. */
46
+ className?: string;
47
+ /** Sets which element a named inner part renders as. */
48
+ slots?: ButtonSlots<StartIcon, EndIcon>;
49
+ /** Props for each slot, merged with the slot's own props rather than replacing them. */
50
+ slotProps?: ButtonSlotProps<StartIcon, EndIcon>;
51
+ /** The icon to render before the button's text. */
52
+ startIcon?: ReactNode;
53
+ /** The icon to render after the button's text. */
54
+ endIcon?: ReactNode;
55
+ }
56
+ /**
57
+ * A button for triggering actions.
58
+ */
59
+ export declare function Button<StartIcon extends ElementType = "span", EndIcon extends ElementType = "span">({ disabled, type, variant, className, slots, slotProps, startIcon, endIcon, children, ...restProps }: ButtonProps<StartIcon, EndIcon>): import("react").JSX.Element;
60
+ export {};
@@ -0,0 +1,47 @@
1
+ import { resolveSlotProps } from "../../utils/slotProps.js";
2
+ import Button_module_default from "./Button.module.js";
3
+ import { Button } from "@base-ui/react/button";
4
+ import { clsx } from "clsx";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/button/Button.tsx
7
+ /**
8
+ * A button for triggering actions.
9
+ */
10
+ function Button$1({ disabled = false, type = "button", variant = "primary", className, slots, slotProps, startIcon, endIcon, children, ...restProps }) {
11
+ const ownerState = {
12
+ variant,
13
+ disabled
14
+ };
15
+ const StartIconSlot = slots?.startIcon ?? "span";
16
+ const EndIconSlot = slots?.endIcon ?? "span";
17
+ const startIconProps = resolveSlotProps({
18
+ ownProps: { className: Button_module_default.startIcon },
19
+ slotProps: slotProps?.startIcon,
20
+ ownerState
21
+ });
22
+ const endIconProps = resolveSlotProps({
23
+ ownProps: { className: Button_module_default.endIcon },
24
+ slotProps: slotProps?.endIcon,
25
+ ownerState
26
+ });
27
+ return /* @__PURE__ */ jsxs(Button, {
28
+ ...restProps,
29
+ type,
30
+ disabled: ownerState.disabled,
31
+ "data-variant": ownerState.variant,
32
+ className: clsx(Button_module_default.root, className),
33
+ children: [
34
+ startIcon != null && /* @__PURE__ */ jsx(StartIconSlot, {
35
+ ...startIconProps,
36
+ children: startIcon
37
+ }),
38
+ children,
39
+ endIcon != null && /* @__PURE__ */ jsx(EndIconSlot, {
40
+ ...endIconProps,
41
+ children: endIcon
42
+ })
43
+ ]
44
+ });
45
+ }
46
+ //#endregion
47
+ export { Button$1 as Button };
@@ -0,0 +1,11 @@
1
+ //#region src/components/button/Button.module.scss
2
+ var root = "dextinityButton";
3
+ var startIcon = "dextinityButton__startIcon";
4
+ var endIcon = "dextinityButton__endIcon";
5
+ var Button_module_default = {
6
+ root,
7
+ startIcon,
8
+ endIcon
9
+ };
10
+ //#endregion
11
+ export { Button_module_default as default, endIcon, root, startIcon };
@@ -0,0 +1,16 @@
1
+ import type { ComponentPropsWithoutRef } from "react";
2
+ import type { ThemeColorScheme } from "../../theme/types";
3
+ export interface ThemeProps extends ComponentPropsWithoutRef<"div"> {
4
+ /**
5
+ * The active color scheme.
6
+ *
7
+ * @defaultValue "light"
8
+ */
9
+ colorScheme?: ThemeColorScheme | (string & {});
10
+ /** Added alongside the component's own classes. */
11
+ className?: string;
12
+ }
13
+ /**
14
+ * Scopes the active color scheme to its subtree. Wrap an application, or a section of one.
15
+ */
16
+ export declare function Theme({ colorScheme, className, children, ...restProps }: ThemeProps): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import Theme_module_default from "./Theme.module.js";
2
+ import { clsx } from "clsx";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/theme/Theme.tsx
5
+ /**
6
+ * Scopes the active color scheme to its subtree. Wrap an application, or a section of one.
7
+ */
8
+ function Theme({ colorScheme = "light", className, children, ...restProps }) {
9
+ return /* @__PURE__ */ jsx("div", {
10
+ ...restProps,
11
+ "data-dextinity-color-scheme": colorScheme,
12
+ className: clsx(Theme_module_default.root, className),
13
+ children
14
+ });
15
+ }
16
+ //#endregion
17
+ export { Theme };
@@ -0,0 +1,5 @@
1
+ //#region src/components/theme/Theme.module.scss
2
+ var root = "dextinityTheme";
3
+ var Theme_module_default = { root };
4
+ //#endregion
5
+ export { Theme_module_default as default, root };
@@ -0,0 +1,43 @@
1
+ import { useRender } from "@base-ui/react/use-render";
2
+ import type { HTMLAttributes, Ref } from "react";
3
+ type TypographyVariant = "headline" | "body";
4
+ type TypographyElement = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span";
5
+ /**
6
+ * The resolved configuration that influences the component's appearance or behavior.
7
+ */
8
+ export type TypographyOwnerState = {
9
+ variant: TypographyVariant;
10
+ };
11
+ export interface TypographyProps extends Omit<HTMLAttributes<HTMLElement>, "className"> {
12
+ /**
13
+ * Visual style. Each variant has a default semantic element.
14
+ *
15
+ * @defaultValue `"body"`
16
+ */
17
+ variant?: TypographyVariant;
18
+ /**
19
+ * The semantic element to render, overriding the variant's default.
20
+ *
21
+ * @defaultValue The variant's default element
22
+ */
23
+ element?: TypographyElement;
24
+ /** Added alongside the component's own classes. */
25
+ className?: string;
26
+ /** Ref forwarded to the root element. */
27
+ ref?: Ref<HTMLElement>;
28
+ /**
29
+ * Render a custom root element instead of the variant's default.
30
+ *
31
+ * @example
32
+ * ```tsx
33
+ * <Typography render={<label htmlFor="email" />}>Email</Typography>
34
+ * ```
35
+ */
36
+ render?: useRender.RenderProp<TypographyOwnerState>;
37
+ }
38
+ /**
39
+ * Renders a single block of text in one of several visual variants, each
40
+ * mapping to a default semantic element.
41
+ */
42
+ export declare function Typography({ variant, element, className, children, ref, render, ...restProps }: TypographyProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
43
+ export {};
@@ -0,0 +1,29 @@
1
+ import Typography_module_default from "./Typography.module.js";
2
+ import { clsx } from "clsx";
3
+ import { useRender } from "@base-ui/react/use-render";
4
+ //#region src/components/typography/Typography.tsx
5
+ var variantElement = {
6
+ headline: "h2",
7
+ body: "p"
8
+ };
9
+ /**
10
+ * Renders a single block of text in one of several visual variants, each
11
+ * mapping to a default semantic element.
12
+ */
13
+ function Typography({ variant = "body", element, className, children, ref, render, ...restProps }) {
14
+ const ownerState = { variant };
15
+ const tagName = element ?? variantElement[ownerState.variant];
16
+ return useRender({
17
+ render,
18
+ ref,
19
+ state: ownerState,
20
+ defaultTagName: tagName,
21
+ props: {
22
+ ...restProps,
23
+ className: clsx(Typography_module_default.root, className),
24
+ children
25
+ }
26
+ });
27
+ }
28
+ //#endregion
29
+ export { Typography };
@@ -0,0 +1,5 @@
1
+ //#region src/components/typography/Typography.module.scss
2
+ var root = "dextinityTypography";
3
+ var Typography_module_default = { root };
4
+ //#endregion
5
+ export { Typography_module_default as default, root };
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from "react";
2
+ export declare function ArrowRightIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from "react";
2
+ export declare function FavoriteIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { Button, type ButtonOwnerState, type ButtonProps } from "./components/button/Button";
2
+ export { Theme, type ThemeProps } from "./components/theme/Theme";
3
+ export { Typography, type TypographyOwnerState, type TypographyProps } from "./components/typography/Typography";
package/lib/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import { Button } from "./components/button/Button.js";
2
+ import { Theme } from "./components/theme/Theme.js";
3
+ import { Typography } from "./components/typography/Typography.js";
4
+ export { Button, Theme, Typography };