@astra-kit/ui 0.0.0-stage → 0.0.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/CHANGELOG.md +15 -0
- package/LICENSE.md +21 -0
- package/README.md +384 -2
- package/THIRD_PARTY_NOTICES.md +31 -0
- package/assets/fonts/geist-LICENSE.txt +93 -0
- package/assets/fonts/geist-latin-variable.woff2 +0 -0
- package/assets/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
- package/assets/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
- package/assets/fonts/ibmplexmono-LICENSE.txt +93 -0
- package/assets/fonts/inter-LICENSE.txt +93 -0
- package/assets/fonts/inter-latin-variable.woff2 +0 -0
- package/dist/adapters/unpic-image.d.ts +3 -0
- package/dist/adapters/unpic-image.js +98 -0
- package/dist/components/account-menu.d.ts +67 -0
- package/dist/components/account-menu.js +440 -0
- package/dist/components/action-button.d.ts +25 -0
- package/dist/components/action-button.js +264 -0
- package/dist/components/alert.d.ts +31 -0
- package/dist/components/alert.js +503 -0
- package/dist/components/animated-collapse.d.ts +19 -0
- package/dist/components/animated-collapse.js +170 -0
- package/dist/components/animated-count.d.ts +13 -0
- package/dist/components/animated-count.js +105 -0
- package/dist/components/animated-list-item.d.ts +25 -0
- package/dist/components/animated-list-item.js +134 -0
- package/dist/components/animated-theme-toggler.d.ts +12 -0
- package/dist/components/animated-theme-toggler.js +200 -0
- package/dist/components/avatar.d.ts +65 -0
- package/dist/components/avatar.js +463 -0
- package/dist/components/badge.d.ts +21 -0
- package/dist/components/badge.js +297 -0
- package/dist/components/button-interaction.d.ts +23 -0
- package/dist/components/button-interaction.js +22 -0
- package/dist/components/button-label.d.ts +8 -0
- package/dist/components/button-label.js +203 -0
- package/dist/components/button.d.ts +23 -0
- package/dist/components/button.js +145 -0
- package/dist/components/calendar.d.ts +47 -0
- package/dist/components/calendar.js +155 -0
- package/dist/components/card.d.ts +38 -0
- package/dist/components/card.js +904 -0
- package/dist/components/carousel.d.ts +71 -0
- package/dist/components/carousel.js +585 -0
- package/dist/components/checkbox.d.ts +15 -0
- package/dist/components/checkbox.js +324 -0
- package/dist/components/control-button.d.ts +16 -0
- package/dist/components/control-button.js +215 -0
- package/dist/components/data-table.d.ts +118 -0
- package/dist/components/data-table.js +895 -0
- package/dist/components/dialog-surface.d.ts +49 -0
- package/dist/components/dialog-surface.js +220 -0
- package/dist/components/dialog.d.ts +92 -0
- package/dist/components/dialog.js +320 -0
- package/dist/components/dropdown-menu.d.ts +57 -0
- package/dist/components/dropdown-menu.js +107 -0
- package/dist/components/field.d.ts +53 -0
- package/dist/components/field.js +710 -0
- package/dist/components/file-upload.d.ts +88 -0
- package/dist/components/file-upload.js +776 -0
- package/dist/components/filter-presets-bar.d.ts +73 -0
- package/dist/components/filter-presets-bar.js +510 -0
- package/dist/components/filter-query-bar.d.ts +21 -0
- package/dist/components/filter-query-bar.js +881 -0
- package/dist/components/filter-query-grammar.d.ts +188 -0
- package/dist/components/filter-query-grammar.js +875 -0
- package/dist/components/form.d.ts +29 -0
- package/dist/components/form.js +330 -0
- package/dist/components/highlighter.d.ts +15 -0
- package/dist/components/highlighter.js +152 -0
- package/dist/components/hover-card.d.ts +50 -0
- package/dist/components/hover-card.js +80 -0
- package/dist/components/input-group.d.ts +16 -0
- package/dist/components/input-group.js +277 -0
- package/dist/components/input.d.ts +17 -0
- package/dist/components/input.js +120 -0
- package/dist/components/label.d.ts +4 -0
- package/dist/components/label.js +43 -0
- package/dist/components/link.d.ts +9 -0
- package/dist/components/link.js +43 -0
- package/dist/components/morph-text.d.ts +14 -0
- package/dist/components/morph-text.js +210 -0
- package/dist/components/pagination.d.ts +59 -0
- package/dist/components/pagination.js +190 -0
- package/dist/components/popover.d.ts +17 -0
- package/dist/components/popover.js +40 -0
- package/dist/components/presence-swap.d.ts +22 -0
- package/dist/components/presence-swap.js +209 -0
- package/dist/components/primitives/alert-dialog.d.ts +68 -0
- package/dist/components/primitives/alert-dialog.js +629 -0
- package/dist/components/primitives/avatar.d.ts +46 -0
- package/dist/components/primitives/avatar.js +265 -0
- package/dist/components/primitives/calendar.d.ts +37 -0
- package/dist/components/primitives/calendar.js +1250 -0
- package/dist/components/primitives/carousel.d.ts +106 -0
- package/dist/components/primitives/carousel.js +928 -0
- package/dist/components/primitives/dialog.d.ts +62 -0
- package/dist/components/primitives/dialog.js +490 -0
- package/dist/components/primitives/dropdown-menu-items.d.ts +59 -0
- package/dist/components/primitives/dropdown-menu-items.js +265 -0
- package/dist/components/primitives/dropdown-menu.d.ts +64 -0
- package/dist/components/primitives/dropdown-menu.js +560 -0
- package/dist/components/primitives/hover-card.d.ts +50 -0
- package/dist/components/primitives/hover-card.js +507 -0
- package/dist/components/primitives/pagination.d.ts +65 -0
- package/dist/components/primitives/pagination.js +373 -0
- package/dist/components/primitives/popover.d.ts +22 -0
- package/dist/components/primitives/popover.js +213 -0
- package/dist/components/primitives/select.d.ts +37 -0
- package/dist/components/primitives/select.js +428 -0
- package/dist/components/primitives/tooltip.d.ts +30 -0
- package/dist/components/primitives/tooltip.js +277 -0
- package/dist/components/progress-ring.d.ts +20 -0
- package/dist/components/progress-ring.js +53 -0
- package/dist/components/radio-group.d.ts +34 -0
- package/dist/components/radio-group.js +392 -0
- package/dist/components/reaction-button.d.ts +30 -0
- package/dist/components/reaction-button.js +189 -0
- package/dist/components/rich-link-editor.d.ts +25 -0
- package/dist/components/rich-link-editor.js +320 -0
- package/dist/components/rich-markdown-content.d.ts +10 -0
- package/dist/components/rich-markdown-content.js +56 -0
- package/dist/components/rich-text-content.d.ts +19 -0
- package/dist/components/rich-text-content.js +26 -0
- package/dist/components/select.d.ts +55 -0
- package/dist/components/select.js +188 -0
- package/dist/components/separator.d.ts +3 -0
- package/dist/components/separator.js +48 -0
- package/dist/components/sheet.d.ts +19 -0
- package/dist/components/sheet.js +420 -0
- package/dist/components/sidebar-panel-context.d.ts +17 -0
- package/dist/components/sidebar-panel-context.js +14 -0
- package/dist/components/sidebar.d.ts +195 -0
- package/dist/components/sidebar.js +2041 -0
- package/dist/components/skeleton.d.ts +23 -0
- package/dist/components/skeleton.js +334 -0
- package/dist/components/split-button.d.ts +36 -0
- package/dist/components/split-button.js +306 -0
- package/dist/components/svgs/whatsappIcon.d.ts +3 -0
- package/dist/components/svgs/whatsappIcon.js +14 -0
- package/dist/components/switch.d.ts +13 -0
- package/dist/components/switch.js +444 -0
- package/dist/components/table.d.ts +10 -0
- package/dist/components/table.js +298 -0
- package/dist/components/tabs.d.ts +36 -0
- package/dist/components/tabs.js +636 -0
- package/dist/components/textarea.d.ts +16 -0
- package/dist/components/textarea.js +111 -0
- package/dist/components/themed-toaster.d.ts +7 -0
- package/dist/components/themed-toaster.js +86 -0
- package/dist/components/toaster.d.ts +12 -0
- package/dist/components/toaster.js +62 -0
- package/dist/components/tooltip.d.ts +43 -0
- package/dist/components/tooltip.js +65 -0
- package/dist/components/typing-animation.d.ts +34 -0
- package/dist/components/typing-animation.js +389 -0
- package/dist/constants/action-button.d.ts +20 -0
- package/dist/constants/action-button.js +17 -0
- package/dist/constants/alert.d.ts +16 -0
- package/dist/constants/alert.js +13 -0
- package/dist/constants/avatar.d.ts +38 -0
- package/dist/constants/avatar.js +32 -0
- package/dist/constants/badge.d.ts +6 -0
- package/dist/constants/badge.js +6 -0
- package/dist/constants/button.d.ts +16 -0
- package/dist/constants/button.js +16 -0
- package/dist/constants/calendar.d.ts +36 -0
- package/dist/constants/calendar.js +34 -0
- package/dist/constants/card.d.ts +23 -0
- package/dist/constants/card.js +20 -0
- package/dist/constants/carousel.d.ts +55 -0
- package/dist/constants/carousel.js +74 -0
- package/dist/constants/checkbox.d.ts +17 -0
- package/dist/constants/checkbox.js +17 -0
- package/dist/constants/dialog.d.ts +11 -0
- package/dist/constants/dialog.js +10 -0
- package/dist/constants/dropdown-menu.d.ts +10 -0
- package/dist/constants/dropdown-menu.js +37 -0
- package/dist/constants/field.d.ts +24 -0
- package/dist/constants/field.js +24 -0
- package/dist/constants/hover-card.d.ts +37 -0
- package/dist/constants/hover-card.js +85 -0
- package/dist/constants/morph-text.d.ts +13 -0
- package/dist/constants/morph-text.js +13 -0
- package/dist/constants/motion.d.ts +12 -0
- package/dist/constants/motion.js +12 -0
- package/dist/constants/pagination.d.ts +20 -0
- package/dist/constants/pagination.js +20 -0
- package/dist/constants/popover.d.ts +7 -0
- package/dist/constants/popover.js +33 -0
- package/dist/constants/radio-group.d.ts +10 -0
- package/dist/constants/radio-group.js +10 -0
- package/dist/constants/select.d.ts +7 -0
- package/dist/constants/select.js +34 -0
- package/dist/constants/sidebar.d.ts +9 -0
- package/dist/constants/sidebar.js +17 -0
- package/dist/constants/skeleton.d.ts +17 -0
- package/dist/constants/skeleton.js +17 -0
- package/dist/constants/split-button.d.ts +7 -0
- package/dist/constants/split-button.js +5 -0
- package/dist/constants/switch.d.ts +33 -0
- package/dist/constants/switch.js +41 -0
- package/dist/constants/tabs.d.ts +17 -0
- package/dist/constants/tabs.js +17 -0
- package/dist/constants/toast.d.ts +3 -0
- package/dist/constants/toast.js +3 -0
- package/dist/constants/tooltip.d.ts +13 -0
- package/dist/constants/tooltip.js +52 -0
- package/dist/hooks/use-horizontal-swipe.d.ts +23 -0
- package/dist/hooks/use-horizontal-swipe.js +80 -0
- package/dist/hooks/use-is-hydrated.d.ts +6 -0
- package/dist/hooks/use-is-hydrated.js +20 -0
- package/dist/hooks/use-mobile.d.ts +1 -0
- package/dist/hooks/use-mobile.js +19 -0
- package/dist/hooks/use-prefers-reduced-motion.d.ts +2 -0
- package/dist/hooks/use-prefers-reduced-motion.js +27 -0
- package/dist/hooks/use-rich-link-editor.d.ts +55 -0
- package/dist/hooks/use-rich-link-editor.js +515 -0
- package/dist/hooks/use-sidebar-persistence.d.ts +6 -0
- package/dist/hooks/use-sidebar-persistence.js +52 -0
- package/dist/hooks/use-today.d.ts +7 -0
- package/dist/hooks/use-today.js +50 -0
- package/dist/hooks/use-viewer-time-zone.d.ts +6 -0
- package/dist/hooks/use-viewer-time-zone.js +20 -0
- package/dist/hooks.d.ts +11 -0
- package/dist/hooks.js +11 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.js +69 -0
- package/dist/lib/browser-clipboard.d.ts +13 -0
- package/dist/lib/browser-clipboard.js +48 -0
- package/dist/lib/column-filter-value.d.ts +12 -0
- package/dist/lib/column-filter-value.js +52 -0
- package/dist/lib/file-acceptance.d.ts +43 -0
- package/dist/lib/file-acceptance.js +107 -0
- package/dist/lib/format-file-size.d.ts +16 -0
- package/dist/lib/format-file-size.js +34 -0
- package/dist/lib/fuzzy-search.d.ts +17 -0
- package/dist/lib/fuzzy-search.js +183 -0
- package/dist/lib/horizontal-swipe.d.ts +23 -0
- package/dist/lib/horizontal-swipe.js +29 -0
- package/dist/lib/image-dimensions.d.ts +2 -0
- package/dist/lib/image-dimensions.js +7 -0
- package/dist/lib/name-initials.d.ts +7 -0
- package/dist/lib/name-initials.js +11 -0
- package/dist/lib/rich-text/link-markdown-constants.d.ts +147 -0
- package/dist/lib/rich-text/link-markdown-constants.js +458 -0
- package/dist/lib/rich-text/link-markdown-types.d.ts +53 -0
- package/dist/lib/rich-text/link-markdown-types.js +1 -0
- package/dist/lib/rich-text/link-markdown.d.ts +193 -0
- package/dist/lib/rich-text/link-markdown.js +592 -0
- package/dist/lib/rich-text/rich-markdown.d.ts +41 -0
- package/dist/lib/rich-text/rich-markdown.js +105 -0
- package/dist/lib/rich-text/rich-text-editor-dom.d.ts +26 -0
- package/dist/lib/rich-text/rich-text-editor-dom.js +79 -0
- package/dist/lib/toast-layer.d.ts +24 -0
- package/dist/lib/toast-layer.js +76 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +2 -0
- package/dist/lib/year-month-filter.d.ts +16 -0
- package/dist/lib/year-month-filter.js +46 -0
- package/dist/motion/arc-floating-slot.d.ts +40 -0
- package/dist/motion/arc-floating-slot.js +177 -0
- package/dist/motion/arc-press.d.ts +6 -0
- package/dist/motion/arc-press.js +59 -0
- package/dist/motion/arc-swap.d.ts +22 -0
- package/dist/motion/arc-swap.js +49 -0
- package/dist/motion/arc-tokens.d.ts +53 -0
- package/dist/motion/arc-tokens.js +73 -0
- package/dist/motion/glide-indicator.d.ts +69 -0
- package/dist/motion/glide-indicator.js +309 -0
- package/dist/motion/glide-slot.d.ts +9 -0
- package/dist/motion/glide-slot.js +71 -0
- package/dist/motion/motion-slot.d.ts +12 -0
- package/dist/motion/motion-slot.js +376 -0
- package/dist/motion/overlay-warmth.d.ts +24 -0
- package/dist/motion/overlay-warmth.js +70 -0
- package/dist/motion/presence.d.ts +40 -0
- package/dist/motion/presence.js +101 -0
- package/dist/motion/surface-keyframes.d.ts +24 -0
- package/dist/motion/surface-keyframes.js +141 -0
- package/dist/motion/tokens.d.ts +81 -0
- package/dist/motion/tokens.js +67 -0
- package/dist/motion/use-attached-element.d.ts +7 -0
- package/dist/motion/use-attached-element.js +22 -0
- package/dist/motion/use-morph-width.d.ts +13 -0
- package/dist/motion/use-morph-width.js +59 -0
- package/dist/next.d.ts +14 -0
- package/dist/next.js +79 -0
- package/dist/providers/astra-ui-provider.d.ts +27 -0
- package/dist/providers/astra-ui-provider.js +100 -0
- package/dist/providers/native-provider.d.ts +4 -0
- package/dist/providers/native-provider.js +45 -0
- package/dist/sonner.d.ts +7 -0
- package/dist/sonner.js +8 -0
- package/dist/styles.css +2 -0
- package/dist/tanstack.d.ts +11 -0
- package/dist/tanstack.js +50 -0
- package/dist/theme.d.ts +3 -0
- package/dist/theme.js +1 -0
- package/dist/types/data-table.d.ts +27 -0
- package/dist/types/data-table.js +1 -0
- package/fonts.css +5 -0
- package/package.json +450 -4
- package/styles.css +4 -0
- package/theme.css +248 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Cambios
|
|
2
|
+
|
|
3
|
+
Todos los cambios relevantes de `@astra-kit/ui` se documentan en este archivo con el formato de [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y versionado [SemVer](https://semver.org/lang/es/). Cada cambio agrega sus entradas en `[Unreleased]`; `pnpm create-version` las pasa a la versión publicada con su fecha.
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- El paquete pasa a llamarse `@astra-kit/ui` y reinicia la numeración: reemplazá la dependencia `beez-ui` por `@astra-kit/ui` y todos los imports, incluidos los subpaths y el CSS (`@astra-kit/ui/next`, `@astra-kit/ui/styles.css`, …). El repositorio ahora es `guidomodarelli/astra-ui`.
|
|
10
|
+
- La API pública usa el prefijo `Astra`: `AstraUIProvider`, `AstraUIProviderProps`, `AstraUIComponents`, `AstraLinkProps`, `AstraImageProps` y `useAstraUIComponents`, también en `@astra-kit/ui/next` y `@astra-kit/ui/tanstack`.
|
|
11
|
+
- Las fuentes de `fonts.css` se registran como `Astra Inter`, `Astra Geist` y `Astra Mono`, la variable CSS de `ReactionButton` es `--astra-reaction-active-color` y el atributo del menú de tema es `data-astra-theme-menu`.
|
|
12
|
+
|
|
13
|
+
### Removed
|
|
14
|
+
|
|
15
|
+
- No se aceptan los nombres anteriores (`BeezUIProvider`, `BeezLinkProps`, `BeezImageProps`, `useBeezUIComponents`, `Beez Inter`/`Geist`/`Mono`, `--beez-reaction-active-color`, `data-beez-theme-menu`): hay que migrar todo de una vez. El historial de `beez-ui` 0.8.1–4.0.1 queda en `docs/history/beez-ui-changelog.md`.
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 shadcn
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,385 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @astra-kit/ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Biblioteca de componentes React reutilizables, con adaptadores opcionales por framework y tema compartido. Reúne los componentes de LaTribu y las funcionalidades reutilizables de agenda-mensual.
|
|
4
|
+
|
|
5
|
+
## Storybook
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm storybook
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Abre `http://localhost:6006` para explorar los componentes con controles de texto,
|
|
12
|
+
variantes, tamaños, estados y comportamiento. El selector de la barra permite
|
|
13
|
+
probar el tema claro, oscuro o del sistema. Las stories de componentes compuestos
|
|
14
|
+
incluyen sus piezas en ejemplos completos; los campos editables y selectores
|
|
15
|
+
sincronizan sus interacciones con Controls. `AstraUIProvider` configura el preview
|
|
16
|
+
y no forma parte del catálogo. Las notificaciones se exploran en `ThemedToaster`,
|
|
17
|
+
sin duplicar una story de `Toaster`; `WhatsappIcon` está en la sección `Icons`.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm build-storybook # Genera storybook-static para servirlo o publicarlo
|
|
21
|
+
pnpm typecheck:stories # Comprueba stories y configuración con TypeScript
|
|
22
|
+
pnpm test:storybook # Build y navegación/interacciones en Chromium y WebKit
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
El catálogo consume los exports públicos y el CSS compilado de la librería. Los
|
|
26
|
+
scripts compilan `@astra-kit/ui` antes de arrancar; si editás sus fuentes con Storybook
|
|
27
|
+
abierto, ejecutá `pnpm build` para actualizar el paquete que muestra el preview.
|
|
28
|
+
Los cambios en las stories se actualizan durante el desarrollo. Storybook y sus
|
|
29
|
+
addons son dependencias de desarrollo y no se incluyen en el paquete publicado.
|
|
30
|
+
|
|
31
|
+
Configuración basada en [React con Vite](https://storybook.js.org/docs/get-started/frameworks/react-vite)
|
|
32
|
+
y [Controls](https://storybook.js.org/docs/essentials/controls).
|
|
33
|
+
|
|
34
|
+
## Uso del paquete
|
|
35
|
+
|
|
36
|
+
El paquete se publica en npm como `@astra-kit/ui`. No hace falta
|
|
37
|
+
configurar el registry ni autenticarse para instalarlo:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
pnpm add @astra-kit/ui
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
import { Avatar, Button, Calendar, DataTable } from "@astra-kit/ui";
|
|
46
|
+
|
|
47
|
+
<Avatar name="Ana Núñez" src="/ana.jpg" />;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Desde 3.0.0 los componentes adoptados de [Arc](https://uiarc.dev) usan la API pública de Arc: `Switch`, `Checkbox`, `RadioGroup`, `Badge`, `Avatar`, `AvatarGroup`, `Skeleton`, `Card`, `Alert`, `Tooltip`, `HoverCard`, `DropdownMenu`, `Select`, `Pagination`, `Calendar` y `Carousel` son componentes cerrados que se configuran por props (`items`, `options`, `members`, `content`, `title`); `Dialog` (`Dialog`, `DialogTrigger`, `DialogContent` con `title` y `description`, `DialogClose`), `Popover` y `Tabs` conservan las partes de Arc. Cada uno suma solo las extensiones que Arc no cubre, con copy en español por defecto, por ejemplo `getHref` en `Pagination`, `trigger` e ítems con `href` en `DropdownMenu`, `onOpenChange` en `HoverCard`, `footer` y el modo `alert` en `Dialog` (reemplaza a `AlertDialog`), `hideLabel` en `Select` y `onSettle` en `Carousel`. La tabla de migración desde 2.x está en [Migración a 3.0.0](#migración-a-300).
|
|
51
|
+
|
|
52
|
+
Agrupar los imports de componentes desde la raíz. El paquete publica JavaScript ESM y declaraciones TypeScript en `dist`; el consumidor no necesita transpilar el código fuente de la librería. La gramática de filtros y los helpers de mes-año son independientes de React.
|
|
53
|
+
|
|
54
|
+
La utilidad `cn`, también exportada desde `@astra-kit/ui`, usa el paquete `cn` para combinar clases condicionales y resolver conflictos de Tailwind.
|
|
55
|
+
|
|
56
|
+
```css
|
|
57
|
+
@import "@astra-kit/ui/styles.css";
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`@astra-kit/ui/styles.css` es CSS listo para el navegador: incluye reset, utilidades, el foundation de [Arc](https://uiarc.dev) (colores, superficies, radios concéntricos, alturas de control, sombras y foco por teclado) con modo claro y oscuro, y las fuentes locales Inter, Geist e IBM Plex Mono. No requiere Tailwind, plugins PostCSS ni declaraciones `@source` en el consumidor. Las clases se compilan en el build de la biblioteca y se publican en `dist/styles.css`; `styles.source.css` es la entrada de desarrollo y no se distribuye.
|
|
61
|
+
|
|
62
|
+
El modo oscuro se activa con `data-theme="dark"` o la clase `dark` en `<html>`; `AstraUIProvider` escribe ambos. El acento por defecto es el azul de Arc y se cambia con `data-accent` (`neutral`, `violet`, `blue`, `green`, `amber`, `orange`, `coral` o `rose`) en `<html>`. Los nombres de tokens de shadcn (`--primary`, `--muted`, `--card`…) siguen disponibles como alias de los roles de Arc; `--accent` es el acento de Arc, no el gris de hover de shadcn. Inter se usa para texto y controles y Geist para títulos grandes mediante `--font-display`; las licencias se incluyen en `assets/fonts`. Los consumidores pueden sobrescribir tokens mediante CSS normal. Si la aplicación usa Tailwind para sus propios estilos puede mantenerlo, pero ya no necesita escanear @astra-kit/ui.
|
|
63
|
+
|
|
64
|
+
El menú de `DropdownMenu` toma el ancho natural de sus opciones, con un mínimo de 12 rem y un máximo limitado por el espacio disponible. No hereda el ancho del botón disparador: los menús abiertos desde un icono deben mantener sus etiquetas legibles. Para un ancho específico, usar `contentClassName` y ajustar también el mínimo cuando se necesite un menú más pequeño.
|
|
65
|
+
|
|
66
|
+
Los componentes usan por defecto los espaciados compactos de Agenda: `Select` mide 2 rem (1.75 rem en tamaño pequeño), `TabsList` horizontal mide 2 rem y `PopoverContent` usa 0.625 rem de padding. Los menús tienen un mínimo de 12 rem, con filas compactas. `Dialog` usa 1 rem de padding y un footer con borde superior y fondo diferenciado; `Textarea` distingue el estado deshabilitado mediante su fondo. Estos valores conservan los colores y fuentes del tema compartido. Son cambios de los defaults, sin una prop adicional para activarlos; los consumidores pueden personalizarlos mediante `className`.
|
|
67
|
+
|
|
68
|
+
Los `Sheet` superiores e inferiores limitan su altura al viewport dinámico (`100dvh`) y permiten desplazar el contenido para mantener accesibles las acciones de paneles largos.
|
|
69
|
+
|
|
70
|
+
## Migración a 3.0.0
|
|
71
|
+
|
|
72
|
+
| Componente | 2.x | 3.0.0 |
|
|
73
|
+
| --- | --- | --- |
|
|
74
|
+
| `Switch` | `size="sm"` | Un solo tamaño, sin `size` |
|
|
75
|
+
| `RadioGroup` | `RadioGroup` + `RadioGroupItem` | `<RadioGroup label options={[{ value, label, description }]} value onValueChange />` |
|
|
76
|
+
| `Badge` | `variant` (`default`, `secondary`, `outline`, `ghost`, `link`, `destructive`) | `tone` (`neutral`, `success`, `info`, `warning`, `danger`); `destructive` pasa a `danger`, el resto a `neutral` |
|
|
77
|
+
| `Avatar` | `Avatar` + `AvatarImage` + `AvatarFallback` (+ `AvatarBadge`) | `<Avatar name src size fallback badge />`; `size="default"` pasa a `md` |
|
|
78
|
+
| `AvatarGroup` | `AvatarGroup` con `Avatar` hijos + `AvatarGroupCount` | `<AvatarGroup members={[{ name, src, status }]} max label />`; con una vista previa de los integrantes, `total` hace que el chip +N cuente contra el total |
|
|
79
|
+
| `Skeleton` | `<Skeleton className="h-4 w-24" />` | `<Skeleton lines={1} className />`, `avatar`, `label`, o `loading` con hijos |
|
|
80
|
+
| `Card` | `CardHeader`, `CardTitle`, `CardDescription`, `CardAction`, `CardContent`, `CardFooter`, `CardMedia` | `title`, `description`, `action`, `children`, `footer`, `media` |
|
|
81
|
+
| `Alert` | `AlertTitle`, `AlertDescription`, `AlertAction`, `variant="destructive"` | `<Alert title tone="danger" action>detalle</Alert>` |
|
|
82
|
+
| `Tooltip` | `TooltipProvider` + `Tooltip` + `TooltipTrigger asChild` + `TooltipContent` | `<Tooltip content side align>{trigger}</Tooltip>`, sin provider |
|
|
83
|
+
| `Popover` | `PopoverAnchor`, `PopoverHeader`, `PopoverTitle`, `PopoverDescription`; `align` centrado por defecto | Solo `Popover`, `PopoverTrigger`, `PopoverContent`, `PopoverClose`; `align="start"` por defecto |
|
|
84
|
+
| `HoverCard` | `HoverCard` + `HoverCardTrigger asChild` + `HoverCardContent` | `<HoverCard content onOpenChange className>{trigger}</HoverCard>` |
|
|
85
|
+
| `DropdownMenu` | `DropdownMenuTrigger asChild`, `Content`, `Item`, `Separator`, `RadioGroup`, `RadioItem`, `CheckboxItem`, `Shortcut`, `Sub*` | `<DropdownMenu label trigger items={[{ label, icon, onSelect, href, destructive, separatorBefore, checked, trailing }]} selection />`; sin submenús. El click dentro del menú no sube por el árbol de React hasta los contenedores que lo envuelven |
|
|
86
|
+
| `Select` | `SelectTrigger`, `SelectValue placeholder`, `SelectContent`, `SelectItem` | `<Select label hideLabel placeholder options={[{ value, label, disabled }]} value onValueChange triggerClassName />`; `aria-describedby` del trigger pasa a `Select` y `options` acepta listas `as const` |
|
|
87
|
+
| `Tabs` | `TabsList variant="line"`, `tabsListVariants` | Solo la lista segmentada |
|
|
88
|
+
| `Pagination` | `PaginationContent`, `PaginationItem`, `PaginationLink`, `PaginationPrevious`, `PaginationNext`, `PaginationEllipsis` | `<Pagination page pageCount onPageChange getHref label />`; sin `pageCount`, `hasNextPage` dibuja solo Anterior y Siguiente. `onPageChange(page, event)` recibe el click: con `getHref`, `event.preventDefault()` pagina en el lugar sin navegar |
|
|
89
|
+
| `Dialog` | `DialogHeader`, `DialogTitle`, `DialogDescription`, `DialogFooter`, `DialogPortal`, `DialogOverlay` | `<DialogContent title description footer hideTitle>`; el cierre se llama "Cerrar diálogo". Lo que acompañaba al título dentro de `DialogHeader` (etiquetas, estado) pasa a `headerContent`, y el ref del cierre a `closeButtonRef` |
|
|
90
|
+
| `AlertDialog` | `AlertDialog`, `AlertDialogContent`, `AlertDialogAction`, `AlertDialogCancel`… y `@astra-kit/ui/alert-dialog` | `<Dialog alert>` con `DialogContent` y `DialogClose asChild` para cancelar y confirmar |
|
|
91
|
+
| `Calendar` | `mode`, `selected`, `onSelect`, `disabled`, `defaultMonth`, `components`, `classNames` | `<Calendar value onChange month onMonthChange minDate maxDate disabledDates locale showToday />`; solo selección simple |
|
|
92
|
+
| `Carousel` | `CarouselContent`, `CarouselItem`, `CarouselPrevious`, `CarouselNext`, `CarouselIndicators`, `opts`, `setApi`, `CarouselApi` | `<Carousel label loop defaultIndex onIndexChange onSettle slideSize>{slides}</Carousel>`; `reInit` ya no hace falta. Las clases de `CarouselContent` y de su pista pasan a `viewportClassName` y `trackClassName` |
|
|
93
|
+
| `AccountMenu` | `children` con `DropdownMenuItem` | `items` con los ítems de `DropdownMenu` |
|
|
94
|
+
| `DataTable` | `columnVisibilityMenuExtraContent` | `columnVisibilityMenuExtraItems` |
|
|
95
|
+
|
|
96
|
+
## Movimiento
|
|
97
|
+
|
|
98
|
+
El movimiento sigue a [Arc](https://uiarc.dev): explica causa y efecto (qué se abrió,
|
|
99
|
+
qué cambió, de dónde vino) y no decora. Si una animación no explica nada, no está.
|
|
100
|
+
Las animaciones usan la dependencia `motion`: `animate` controla la reproducción,
|
|
101
|
+
`hover` y `press` los gestos, y `AnimatePresence` / `usePresence` retienen los
|
|
102
|
+
overlays durante su salida. Los presets y tiempos viven en `src/motion/`. No se usan
|
|
103
|
+
keyframes CSS para estas animaciones.
|
|
104
|
+
|
|
105
|
+
`MotionSlot` anima el nodo original del primitive mediante refs compuestos,
|
|
106
|
+
sin agregar wrappers al DOM ni reemplazar sus handlers. Los tokens exportados en
|
|
107
|
+
`@astra-kit/ui/motion-tokens` son únicamente los presets de Arc
|
|
108
|
+
(`components/arc/lib/motion-tokens.ts`):
|
|
109
|
+
|
|
110
|
+
- Springs: `snappy` (0.26 s, rebote 0.12) para presiones, indicadores chicos y cambios de
|
|
111
|
+
ícono (`SPRING_PRESS`, `SPRING_POP`, `SPRING_CHEVRON`); `smooth` (0.4 s, sin rebote) para
|
|
112
|
+
paneles, alturas y todo lo que informa un estado (`SPRING_PANEL`); `morph` (0.42 s, rebote
|
|
113
|
+
0.16) para resaltados compartidos (`SPRING_LAYOUT`).
|
|
114
|
+
- Duraciones: `instant` 0.12 s, `fast` 0.16 s, `exit` 0.18 s, `enter`/`standard` 0.24 s y
|
|
115
|
+
`considered` 0.48 s. Las salidas son más cortas que las entradas.
|
|
116
|
+
- Curvas: `MOTION_EASE` (entrada), `MOTION_EASE_EXIT`, `MOTION_EASE_STANDARD` y
|
|
117
|
+
`MOTION_EASE_IN_OUT`.
|
|
118
|
+
|
|
119
|
+
Ningún componente agrega movimiento que Arc no tenga: no hay entradas al montar en cards,
|
|
120
|
+
badges, separadores, filas de tabla ni alertas estáticas; no hay hovers con escala,
|
|
121
|
+
rotación u opacidad en enlaces e íconos; los campos no reaccionan al foco con movimiento y
|
|
122
|
+
no tiemblan al pasar a `aria-invalid="true"`.
|
|
123
|
+
|
|
124
|
+
- `Button`, `ControlButton` y los pasos de `Pagination` usan la presión de Arc: se comprimen
|
|
125
|
+
a 0.97 (un poco más los de solo ícono y menos los anchos) y vuelven con `snappy`; los
|
|
126
|
+
disparadores de menús, popovers y diálogos responden solo con color.
|
|
127
|
+
- `Checkbox`, `RadioGroup`, `Switch`, `Tabs`, `Calendar`, `Carousel`, `Card`, `Avatar`,
|
|
128
|
+
`AvatarGroup`, `Badge`, `Alert`, `ActionButton` y `SplitButton` usan el movimiento de sus
|
|
129
|
+
componentes de Arc.
|
|
130
|
+
- Una `Card` interactiva se eleva 2 px con el borde fuerte y la sombra `--shadow-raised` de
|
|
131
|
+
Arc al pasar un puntero fino.
|
|
132
|
+
- `Tooltip`, `Popover` y `HoverCard` se acercan desde su trigger con escala y fundido.
|
|
133
|
+
`DropdownMenu` crece 5 px desde su trigger y desde 0.97 con el spring de Arc y sale en
|
|
134
|
+
130 ms; sus ítems entran escalonados. `Select` crece 6 px desde 0.97 en 0.24 s; sus
|
|
135
|
+
opciones no se animan por separado y el check de la opción elegida aparece desde 0.6 con
|
|
136
|
+
un desenfoque breve, igual que el de los ítems con check de `DropdownMenu`.
|
|
137
|
+
- `Dialog`, también en su modo `alert`, entra como el diálogo de Arc: el fondo se oscurece en 0.24 s y el
|
|
138
|
+
panel sube 8 px y crece desde 0.96 con el spring `smooth` mientras aparece en 0.16 s; al
|
|
139
|
+
cerrar baja 4 px hasta 0.98 y se desvanece en 0.16 s, y una reapertura parte de donde
|
|
140
|
+
está. `Sheet` entra desde su borde con `smooth` y sale en 0.24 s con la curva estándar,
|
|
141
|
+
desvaneciéndose al final como el drawer de Arc. Los botones de cierre no tienen animación
|
|
142
|
+
de entrada.
|
|
143
|
+
- `GlideSlot` desliza el indicador activo entre ítems como un `layoutId` compartido: la
|
|
144
|
+
pestaña activa de `Tabs`, la página actual de `Pagination` y el resaltado de `DropdownMenu`,
|
|
145
|
+
que se desliza con el puntero y salta al instante con el teclado. `Select` y las
|
|
146
|
+
sugerencias de `FilterQueryBar` no tienen resaltado deslizante.
|
|
147
|
+
- El chevron del trigger de `Select` gira 180° con el spring CSS de Arc y los chevrons de
|
|
148
|
+
`DataTable` (grupos y columnas) giran con `snappy`; CSS define el ángulo final.
|
|
149
|
+
- `FormMessage` sube un tercio de línea desde un desenfoque al aparecer, como las filas de
|
|
150
|
+
ayuda y error de Arc.
|
|
151
|
+
- El ancho de `Sidebar` cambia con `smooth` entre el panel y el riel de íconos, las
|
|
152
|
+
etiquetas se desvanecen y se desplazan 6 px al colapsar, el resaltado del ítem activo se
|
|
153
|
+
desliza con `morph`, el hover solo cambia el color, los submenús abren su altura con
|
|
154
|
+
`smooth` y en pantallas chicas se abre como hoja con foco atrapado.
|
|
155
|
+
- El ícono de `AnimatedThemeToggler` crece desde 0.7 desde un desenfoque con `snappy`; el
|
|
156
|
+
botón no gira ni se desvanece al cambiar el tema.
|
|
157
|
+
- La foto de `Avatar` aparece desde un desenfoque de 4 px al terminar de cargar; las
|
|
158
|
+
imágenes ya cargadas al montar no se animan.
|
|
159
|
+
- `ReactionButton` le da al ícono el impulso de las reacciones de Arc al activarse.
|
|
160
|
+
- `AnimatedCollapse` abre y cierra su altura con `smooth`; `PresenceSwap` usa el swap de
|
|
161
|
+
Arc (sube 0.3 em desde un desenfoque y la versión anterior sale hacia arriba);
|
|
162
|
+
`AnimatedListItem` entra 4 px desde un desenfoque leve y se reordena con `smooth`.
|
|
163
|
+
- El cursor de `TypingAnimation` queda fijo mientras escribe y parpadea en reposo. Las animaciones especializadas
|
|
164
|
+
existentes de Embla, Sonner y rough-notation se conservan.
|
|
165
|
+
|
|
166
|
+
El contenido que está saliendo deja de ser interactivo y accesible de inmediato.
|
|
167
|
+
Cada familia de overlays tiene un contexto de visibilidad independiente para
|
|
168
|
+
soportar composiciones anidadas; los portales sin nodo visible no bloquean el
|
|
169
|
+
cierre del padre. `Select` conserva su desmontaje nativo y usa Motion en la entrada.
|
|
170
|
+
La elección explícita de `forceMount` permanece bajo control del consumidor.
|
|
171
|
+
|
|
172
|
+
Se respeta `prefers-reduced-motion`: las nuevas animaciones se cancelan y se
|
|
173
|
+
restauran los estilos; las anotaciones se dibujan sin animación y el texto aparece
|
|
174
|
+
completo, incluidas todas las palabras de una secuencia. Los controles del carrusel
|
|
175
|
+
avanzan directamente. El CSS solo aporta el fallback de movimiento reducido para
|
|
176
|
+
los efectos heredados. `AstraUIProvider` configura `MotionConfig` con
|
|
177
|
+
`reducedMotion="user"`. El primer render conserva el contrato de SSR.
|
|
178
|
+
|
|
179
|
+
El selector aplica el tema inmediatamente y anima su icono con Motion; no depende
|
|
180
|
+
de View Transitions nativas ni de una animación para completar el cambio. Los estilos temporales se liberan al terminar
|
|
181
|
+
la reproducción. Las stories permiten probar los gestos y estados reales; el
|
|
182
|
+
selector de tema de la story y la barra de Storybook se mantienen sincronizados.
|
|
183
|
+
|
|
184
|
+
## Providers de UI
|
|
185
|
+
|
|
186
|
+
Elegir un único `AstraUIProvider` según el framework. Los componentes y `useTheme` siempre se importan desde `@astra-kit/ui`.
|
|
187
|
+
|
|
188
|
+
| Import del provider | Navegación | Imágenes de avatar |
|
|
189
|
+
| --- | --- | --- |
|
|
190
|
+
| `@astra-kit/ui` | Anclas nativas | `@unpic/react` |
|
|
191
|
+
| `@astra-kit/ui/next` | `next/link` | `next/image` |
|
|
192
|
+
| `@astra-kit/ui/tanstack` | TanStack Router | `@unpic/react` |
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
"use client";
|
|
196
|
+
|
|
197
|
+
import type { ReactNode } from "react";
|
|
198
|
+
import { AstraUIProvider } from "@astra-kit/ui/next";
|
|
199
|
+
|
|
200
|
+
export function Providers({ children }: { children: ReactNode }) {
|
|
201
|
+
return (
|
|
202
|
+
<AstraUIProvider themeOptions={{ storageKey: "tutribu-theme", defaultTheme: "system" }}>
|
|
203
|
+
{children}
|
|
204
|
+
</AstraUIProvider>
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Todos los providers usan `next-themes` con clases CSS. El consumidor configura `themeOptions` y conecta sus controles a `useTheme` desde `@astra-kit/ui`. Al migrar una aplicación, conservar su clave de almacenamiento y retirar los scripts y estados anteriores que modifiquen el tema. En Next, mantener `suppressHydrationWarning` en el elemento `html` porque el provider restaura la preferencia antes de hidratar.
|
|
210
|
+
|
|
211
|
+
El provider de Next desactiva prefetch y optimización de imágenes por defecto, como LaTribu. Se activan con `prefetch` y `optimizeImages`; para optimizar imágenes remotas hay que configurar sus hosts en la app. `Link` y los enlaces de paginación usan el adaptador del provider. El contrato común de `Link` acepta href como string y atributos de ancla, no todas las opciones exclusivas de Next.
|
|
212
|
+
|
|
213
|
+
El provider de TanStack se monta dentro del router de la aplicación. Preserva query y hash; `prefetch` activa precarga por intención. TanStack no aporta un componente Image propio: Unpic genera variantes responsivas para CDNs compatibles y conserva las URLs que no reconoce; no instala un servidor de optimización.
|
|
214
|
+
|
|
215
|
+
Next y TanStack Router son peers opcionales aislados en sus entrypoints. El provider nativo admite overrides mediante `components`. Sin provider, los componentes conservan anclas e imágenes HTML como fallback.
|
|
216
|
+
|
|
217
|
+
## Responsabilidades del consumidor
|
|
218
|
+
|
|
219
|
+
- Tema: `AnimatedThemeToggler` y `ThemedToaster` consumen el contexto compartido. Sus props explícitas de tema siguen disponibles para usos controlados.
|
|
220
|
+
- Navegación: con `getHref`, `Pagination` dibuja enlaces con el `Link` del provider. Sin proveedor usa anclas nativas; con el proveedor de Next usa su navegación cliente.
|
|
221
|
+
- Sidebar: en `SidebarProvider`, `defaultOpen` y el modo controlado conservan la semántica de LaTribu. Los ítems con `href` navegan con el adaptador de router del proveedor. `storageKey` activa opcionalmente persistencia local segura tras hidratar, sin cambiar la cookie pública `sidebar_state` ni sus siete días de duración; `cookieName` y `cookieMaxAge` la reemplazan cuando la app ya lee su propia cookie en el servidor. Para el contenido propio: `SidebarBrandButton` arma la fila de marca (sirve como `trigger` de `DropdownMenu`), `SidebarLabel` saca del riel de íconos el texto que solo tiene sentido expandido, `useSidebarPanel()` expone `collapsed` y `AccountMenu` con `triggerVariant="sidebar"` se reduce solo al avatar. No dependas de los atributos `data-*` internos del sidebar: pueden cambiar entre versiones.
|
|
222
|
+
- Formularios y tablas: el consumidor provee sus datos, validaciones y callbacks. No se importan servicios, modelos de negocio ni endpoints de agenda-mensual.
|
|
223
|
+
|
|
224
|
+
## Componentes incorporados desde agenda-mensual
|
|
225
|
+
|
|
226
|
+
`Alert`, `AnimatedThemeToggler`, `Calendar`, `DataTable`, `FilterQueryBar`, `Form`, `Highlighter`, `InputGroup`, `Label`, `RadioGroup`, `TypingAnimation` y `ThemedToaster`, junto con sus tipos y gramática de filtros.
|
|
227
|
+
|
|
228
|
+
`FilterQueryBar` mantiene el foco en el input mientras se recorren las sugerencias con el puntero o las flechas. Enter aplica la opción activa; interactuar con el input no cierra la lista.
|
|
229
|
+
|
|
230
|
+
La tabla conserva agrupación estable, columnas configurables, memoización, exclusiones y sincronización de qualifiers por identificadores. La barra conserva navegación por teclado, autocompletado y filtros de texto, rangos, fechas, presencia y carpetas. `Calendar` usa español por defecto y acepta otra locale. Los textos y configuraciones de filtros se pueden personalizar por props.
|
|
231
|
+
|
|
232
|
+
Los componentes compartidos conservan el tema de LaTribu. Se incorporaron atributos `data-variant`/`data-size` del botón, scroll para paneles largos y persistencia opcional del sidebar. `Button` sigue la API de Arc: `variant` `primary`, `secondary`, `ghost` o `danger`, `size` `sm`, `md` o `lg` y `loading`; renderiza un `<button>` nativo con `type="button"` por defecto y no admite `asChild`: un link con aspecto de botón se estiliza como link. Se mantienen los estados deshabilitados y los skeletons deterministas. La foto de `Avatar` delega carga y fallback a Base UI; conserva carga diferida y recuperación al cambiar `src`. El export `Toaster` conserva el aspecto y las props de Sonner, y sus toasts responden al click y al teclado (Alt+T) con un `Dialog` o `Sheet` abierto; `ThemedToaster` se apoya en él y agrega los estilos e iconos compartidos.
|
|
233
|
+
|
|
234
|
+
## Componentes de producto reutilizables
|
|
235
|
+
|
|
236
|
+
Provienen de las carpetas de producto de LaTribu y agenda-mensual y quedaron desacoplados de su dominio: reciben datos ya resueltos y textos por props, con valores por defecto en español. Solo se incorporan piezas genéricas que no fijan decisiones de un producto y que no son una composición trivial de primitivas existentes; los flujos propios de una app (notificaciones, calendarios de eventos, handoff de navegadores internos, actualización de PWA) y los envoltorios simples (estados vacío y de error, loaders, popovers de ayuda) se mantienen en esa app.
|
|
237
|
+
|
|
238
|
+
- Movimiento: `PresenceSwap`, `AnimatedCount`, `AnimatedCollapse` y `AnimatedListItem`. Los tokens que usa la biblioteca se exportan desde la raíz y desde `@astra-kit/ui/motion-tokens`, así las apps animan sus superficies con las mismas curvas y springs en lugar de copiarlos.
|
|
239
|
+
- Indicadores: `ProgressRing` y `ReactionButton`. El color del ícono activo de la reacción se configura con `activeColor`.
|
|
240
|
+
- Acciones (de Arc, sobre `Button`): `ActionButton` corre una acción asíncrona (`onAction`) y muestra el resultado en el propio botón: pasa de la flecha al spinner con `pendingLabel` ("Guardando") y al check con `successLabel` ("Guardado"), y vuelve solo a idle después de `resetAfterMs`. Mientras corre sigue enfocable e ignora nuevas pulsaciones, y si falla vuelve a idle y entrega el error a `onActionError`. `SplitButton` une una acción principal con un menú de acciones relacionadas (`actions`): su ícono y su label cambian en el lugar, y la mitad del menú se nombra "Más acciones de {label}" o con `menuLabel`. Para un envío común sin estado de éxito, usá `Button` con `loading`.
|
|
241
|
+
- Cuenta: `AccountMenu`, con inicio de sesión mediante `signInHref` o `onSignIn`.
|
|
242
|
+
- Contenido: `RichTextContent`, `RichMarkdownContent`, `RichLinkEditor` y `useRichLinkEditor`. Solo interpretan links en markdown, URLs sueltas, listas y negrita; el HTML del contenido nunca se renderiza como markup.
|
|
243
|
+
- Filtros guardados: `FilterPresetsBar` y `FilterPresetSaveButton` guardan, aplican, editan y borran consultas con nombre de `FilterQueryBar`. La app decide dónde persistirlas; `parseFilterPresets` valida lo que vuelve del almacenamiento.
|
|
244
|
+
- Archivos: `FileUpload`, `FileUploadDropZone`, `FileUploadList` y `FileUploadItem` validan tipo y tamaño, pero no suben archivos: el progreso y los errores los informa la app. Cada ítem acepta un ícono propio y un progreso en barra (`bar`) o de relleno (`fill`).
|
|
245
|
+
- Utilidades: `formatFileSize`, `copyTextToClipboard` y búsqueda difusa.
|
|
246
|
+
|
|
247
|
+
Los hooks de uso general se importan desde `@astra-kit/ui/hooks`: `useIsMobile`, `useIsHydrated`, `useViewerTimeZone`, `usePrefersReducedMotion` y `useHorizontalSwipe` (con `resolveHorizontalSwipe`). `useIsMobile` también sigue disponible desde la raíz.
|
|
248
|
+
|
|
249
|
+
```tsx
|
|
250
|
+
import { useIsHydrated } from "@astra-kit/ui/hooks";
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## React Compiler
|
|
254
|
+
|
|
255
|
+
El build usa el port de React Compiler en Rust de [Oxc](https://oxc.rs/blog/2026-08-18-react-compiler-support), mediante `oxc-transform-react`. Esta integración sigue marcada como experimental por Oxc.
|
|
256
|
+
|
|
257
|
+
Las optimizaciones se incluyen en el JavaScript publicado: el consumidor no necesita habilitar React Compiler en Vite, Next ni otro bundler. El target es React 19 y utiliza `react/compiler-runtime`, incluido en el peer React 19.2; no se añade un runtime independiente.
|
|
258
|
+
|
|
259
|
+
TypeScript 7 valida los tipos y genera las declaraciones. Oxc recibe los fuentes originales y ejecuta React Compiler antes de eliminar TypeScript y transformar JSX. Conserva ESM, los exports y las directivas de cliente. Sólo los módulos cuyo prólogo declara `"use client"` reciben memoización automática; los módulos compatibles con Server Components se emiten sin cachés de cliente. Esto evita introducir hooks del runtime de cliente en el render servidor de Next.
|
|
260
|
+
|
|
261
|
+
La cobertura depende de las heurísticas del compilador y de las reglas de React: algunas funciones conservan su implementación sin optimizar. Las memoizaciones y comentarios del código fuente permanecen intactos. El build informa cuántos módulos incluyen memoización automática y falla ante errores fatales de transformación.
|
|
262
|
+
|
|
263
|
+
```sh
|
|
264
|
+
# Comparar el comportamiento sin memoización automática.
|
|
265
|
+
pnpm test:uncompiled
|
|
266
|
+
|
|
267
|
+
# Volver a generar la distribución optimizada.
|
|
268
|
+
pnpm build
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
`test:uncompiled` usa `pnpm build --no-react-compiler` y ejecuta Vitest. CI y `release:prepare` ejecutan esa comparación antes del check normal, que restaura el build optimizado. Los consumidores de prueba no habilitan un segundo compilador: ejercen el paquete generado, incluido un componente de servidor real en Next.
|
|
272
|
+
|
|
273
|
+
## Desarrollo y validación
|
|
274
|
+
|
|
275
|
+
Usar pnpm **12.3.4**. Las dependencias tienen rangos `^` y el lockfile fija las versiones verificadas.
|
|
276
|
+
|
|
277
|
+
```sh
|
|
278
|
+
pnpm install --frozen-lockfile
|
|
279
|
+
pnpm check
|
|
280
|
+
pnpm exec playwright install chromium webkit
|
|
281
|
+
pnpm test:browser
|
|
282
|
+
pnpm build
|
|
283
|
+
pnpm release:prepare
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
`pnpm build` genera las declaraciones con TypeScript 7, JavaScript con Oxc/React Compiler y CSS con el CLI de Tailwind. `pnpm check` ejecuta oxlint (configurado en `.oxlintrc.json`), los typechecks separados de código y tests con TypeScript 7, y Vitest 5. `tests/tsconfig.json` incorpora los matchers de Testing Library y los tipos de Vite sin incluirlos en el código de producción. `test:browser` verifica una app React/Vite nativa y una app Next real en Chromium y WebKit, tanto en desktop como en móvil. Los tests unitarios importan los archivos compilados. Los consumidores de navegador no instalan plugins de Tailwind, y una prueba adicional sirve el tarball por HTTP sin procesadores CSS para verificar estilos computados y carga de fuentes. Una prueba adicional instala el tarball en un consumidor aislado sin Next y verifica render, filtrado y declaraciones públicas.
|
|
287
|
+
|
|
288
|
+
En Windows, una corrida de Playwright que muere de golpe (proceso terminado a la fuerza, sesión cerrada o timeout de la herramienta que la lanzó) deja vivos `Playwright.exe` de WebKit y sus procesos `WebKitGPUProcess.exe`, `WebKitNetworkProcess.exe` y `WebKitWebProcess.exe`: Windows no termina a los hijos de un proceso terminado y `globalTeardown` no llega a correr. Esos procesos quedan sin padre y mantienen bloqueada la carpeta del repositorio, que heredan como directorio de trabajo. `playwright.config.ts` y `playwright.storybook.config.ts` usan como `globalSetup` y `globalTeardown` las entradas `@astra-kit/cleaner/playwright/global-setup` y `@astra-kit/cleaner/playwright/global-teardown` del paquete [`@astra-kit/cleaner`](https://github.com/guidomodarelli/astra-cleaner), compartido con TuTribu y agenda-mensual, así que cada corrida cierra los que dejaron las anteriores. Solo cierra procesos cuyo ejecutable está dentro de una carpeta `ms-playwright` y cuyo proceso padre ya no existe (o también se está cerrando por huérfano). Como Windows reutiliza los identificadores de proceso, un proceso vivo que arrancó después del hijo no cuenta como su padre; si no se conoce alguna de las dos horas de inicio, el proceso se conserva. Nunca toca un navegador en uso. Si la consulta o el cierre fallan, imprime un aviso y la corrida sigue. Para cerrarlos a mano sin correr tests, usar `pnpm test:browser:cleanup` (ejecuta `cleaner playwright`); `pnpm test:browser:cleanup --dry-run` solo lista los procesos que cerraría. En otras plataformas no hace nada. `@astra-kit/cleaner` está en `minimumReleaseAgeExclude` de `pnpm-workspace.yaml` para poder tomar sus versiones apenas se publican.
|
|
289
|
+
|
|
290
|
+
Los tests resuelven `@astra-kit/ui`, `@astra-kit/ui/next`, `@astra-kit/ui/tanstack` y `@astra-kit/ui/hooks` mediante rutas explícitas a las declaraciones compiladas en `tests/tsconfig.json`. Ejecutar `pnpm build` después de clonar o si falta `dist`; los comandos de validación completos ya lo hacen. Si el editor conserva diagnósticos anteriores después del build, reiniciar su servidor de TypeScript.
|
|
291
|
+
|
|
292
|
+
El compilador `tsc` es TypeScript 7. El paquete `typescript` apunta a la [API de compatibilidad oficial de TypeScript 6](https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/#running-side-by-side-with-typescript-6.0) mediante un alias, porque el plugin de docgen de Storybook lo declara como dependencia peer; no reemplaza el compilador de los typechecks. El lint no depende de él: oxlint analiza TypeScript sin el compilador.
|
|
293
|
+
|
|
294
|
+
## Crear y publicar una versión
|
|
295
|
+
|
|
296
|
+
### Desde GitHub Actions
|
|
297
|
+
|
|
298
|
+
El workflow **Release** se ejecuta automáticamente con cada push o merge a `main`,
|
|
299
|
+
incluidos los cambios de `package.json`. También se puede iniciar en GitHub desde
|
|
300
|
+
**Actions → Release → Run workflow**, seleccionando `main`.
|
|
301
|
+
El workflow usa `pnpm create-version --accept-suggested`: astra-rp calcula la versión
|
|
302
|
+
y verifica que `[Unreleased]` tenga entradas escritas a mano, cierra esa sección con la versión, prepara y valida el tarball, crea y sube
|
|
303
|
+
el commit y el tag y publica en npm con trusted publishing (OIDC).
|
|
304
|
+
|
|
305
|
+
El disparador también incluye los pushes que cambian `package.json`, pero
|
|
306
|
+
astra-rp no retoma una versión editada a mano en un commit común: necesita
|
|
307
|
+
su commit de versión y tag de release. Para el flujo automático, dejar que
|
|
308
|
+
astra-rp aumente la versión según los commits.
|
|
309
|
+
|
|
310
|
+
No necesita secrets manuales: pasa `GITHUB_TOKEN` como `NPM_TOKEN`, con
|
|
311
|
+
`contents: write` para subir el release y `packages: write` para publicar.
|
|
312
|
+
El token se entrega solo al paso de release. El workflow conserva el historial
|
|
313
|
+
completo de Git, instala Chromium y WebKit para las validaciones y serializa
|
|
314
|
+
los releases sin cancelar uno que ya esté en curso. Solo permite ejecutarlos
|
|
315
|
+
sobre `main`.
|
|
316
|
+
|
|
317
|
+
Si el paquete ya existe, este repositorio debe tener acceso de escritura en
|
|
318
|
+
**Package settings → Manage Actions access**. Si una regla de protección de
|
|
319
|
+
`main` impide pushes del token del workflow, debe ajustarse para permitir el
|
|
320
|
+
flujo de release antes de ejecutarlo. No ejecutar un release local mientras
|
|
321
|
+
esté corriendo el de Actions. Los pushes hechos con `GITHUB_TOKEN` no disparan
|
|
322
|
+
otros workflows, incluido **Release**, por lo que el commit de versión no crea un
|
|
323
|
+
bucle de publicaciones. La preparación del release ejecuta las validaciones completas.
|
|
324
|
+
Para retomar una publicación fallida después del push, volver a ejecutar **Release**.
|
|
325
|
+
|
|
326
|
+
### Desde una terminal local
|
|
327
|
+
|
|
328
|
+
Desde este repositorio, configurar `NPM_TOKEN` con un token personal de GitHub **clásico** con `write:packages` en el entorno o en `.env`, tomando `.env.example` como referencia. Si el valor existente es un token de npm, reemplazarlo localmente por el de GitHub. No pegarlo en el chat ni agregar credenciales al `.npmrc` del proyecto: astra-rp rechaza esas credenciales. El campo `repository` del manifest vincula el paquete con este repositorio.
|
|
329
|
+
|
|
330
|
+
### Un solo comando: `pnpm create-version` (alias `pnpm cv`)
|
|
331
|
+
|
|
332
|
+
```sh
|
|
333
|
+
pnpm create-version # diagnóstico, plan y release interactivo
|
|
334
|
+
pnpm create-version --bump minor # patch | minor | major sin preguntar
|
|
335
|
+
pnpm create-version -b m # atajo de --bump: acepta p | m | M (o -b=m)
|
|
336
|
+
pnpm create-version -m # atajos --patch/-p, --minor/-m, --major/-M
|
|
337
|
+
pnpm create-version --set-version 0.7.0 # versión exacta
|
|
338
|
+
pnpm create-version -sv 0.7.0 # atajo de --set-version (o -sv=0.7.0)
|
|
339
|
+
pnpm create-version -l # atajo de --local: todo el release en esta máquina
|
|
340
|
+
pnpm create-version --accept-suggested # toma la versión sugerida por los commits
|
|
341
|
+
pnpm create-version --dry-run # solo muestra el diagnóstico y el plan
|
|
342
|
+
pnpm cv # alias de pnpm create-version
|
|
343
|
+
pnpm create-version -h # todas las opciones (atajo de --help)
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Los flags cortos distinguen mayúsculas (`-m` es minor y `-M` major) y van de a uno (`-l -m`, no `-lm`). Pedir dos tipos de versión distintos, combinar un tipo con `--set-version` o `--ci` con `--local` corta con un error.
|
|
347
|
+
|
|
348
|
+
El comando es el motor compartido `astra-rp create-version` (devDependency `@astra-kit/rp`). Su funcionamiento general (diagnóstico, bloqueos, reanudación, versiones permitidas) está documentado en el README de [@astra-kit/rp](https://github.com/guidomodarelli/astra-rp#create-version). Lo propio de @astra-kit/ui vive en `astra-rp.config.js`: la descripción de cada tipo de versión, la zona horaria de la fecha del CHANGELOG (`releaseTimeZone`), el hook `prepare` de `scripts/release-hooks.js` y la publicación en npm del tarball preparado (`publish: "npm"` + `artifact`, con `publication.authentication: "oidc"`).
|
|
349
|
+
|
|
350
|
+
Los releases salen sólo desde `main`, limpio y al día con origin (sólo `CHANGELOG.md` puede quedar sin commitear). En otra rama explica qué falta: pushear, abrir o mergear el PR. El último release es el último commit de `origin/main` que cambió el `version` de `package.json`, así que reconoce tanto los commits `X.Y.Z` como los anteriores `chore(release): prepara la versión X.Y.Z`.
|
|
351
|
+
|
|
352
|
+
### Flujo validado de un release nuevo
|
|
353
|
+
|
|
354
|
+
1. Actualiza `main` con fast-forward si está atrás.
|
|
355
|
+
2. Verifica que `CHANGELOG.md` tenga un bloque `## [Unreleased]` con entradas y solo secciones de Keep a Changelog. Si faltan, las redacta con Claude Code o, si falla, con Codex (`changelogDraft: true` en `astra-rp.config.js`) y las muestra en la terminal; si ningún agente puede, bloquea el release.
|
|
356
|
+
3. Pide la versión (sugiere `patch`, `minor` o `major` según los commits) y crea el commit `X.Y.Z` con la versión del manifiesto, el CHANGELOG con `[Unreleased]` renombrado a `## [X.Y.Z] - AAAA-MM-DD` y un `## [Unreleased]` vacío arriba, y el tag anotado `vX.Y.Z`, antes de las validaciones largas.
|
|
357
|
+
4. `prepare` (`scripts/release-hooks.js`): reusa el tarball ya preparado para esa versión si es posterior al último cambio de código (el commit de versión no cuenta); si no, ejecuta `pnpm release:prepare` sobre el commit de versión: instalación congelada, tests sin React Compiler, build optimizado, lint, typechecks, tests unitarios y pruebas de navegador, y genera el tarball verificado con `npm pack --ignore-scripts` (npm y no pnpm, para que sea reproducible) en `releases/<version>-<sha256>/astra-kit-ui-<version>.tgz`.
|
|
358
|
+
5. Sube `main` y el tag `vX.Y.Z` a origin con un único `git push --atomic`.
|
|
359
|
+
6. Publicación: astra-rp exige que el commit de versión siga sin cambios, toma `releases/<version>-<sha256>/astra-kit-ui-<version>.tgz`, verifica el SHA-256 de su ruta y compara su SHA-512 con el `integrity` de `npm pack --dry-run` sobre ese commit (`npm pack` es reproducible, así que coincidir prueba que es byte a byte lo que npm empaqueta) y recién ahí lo publica en npm con etiqueta `latest`. Además, `prepublishOnly` ejecuta `astra-rp guard-publish`, que corta un `pnpm publish` manual (o yarn/bun): se publica sólo con `pnpm create-version`, que usa npm.
|
|
360
|
+
|
|
361
|
+
Si algo falla después del commit de versión, basta con volver a ejecutar `pnpm create-version`: si `HEAD` es el commit `X.Y.Z` y npm todavía no tiene esa versión, retoma sólo la preparación (reusando el tarball si sigue vigente), el push si falta y la publicación. Nunca vuelve a subir la versión.
|
|
362
|
+
|
|
363
|
+
La publicación usa el cliente oficial de npm contra `https://registry.npmjs.org/` con [trusted publishing](https://docs.npmjs.com/trusted-publishers): el workflow **Release** tiene `id-token: write`, instala npm 11.5.1 y npm intercambia el token OIDC de GitHub Actions por una credencial de un solo uso, así que no hay tokens de npm guardados en el repositorio ni en los secrets. El paquete `@astra-kit/ui` en npm tiene configurado como trusted publisher este repositorio y el workflow `release.yml`; por eso la publicación solo funciona desde ese workflow. Instalación, build y checks siguen usando pnpm 12.
|
|
364
|
+
|
|
365
|
+
### CHANGELOG
|
|
366
|
+
|
|
367
|
+
`CHANGELOG.md` sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/). Cada cambio agrega sus entradas en el bloque `## [Unreleased]`, agrupadas en `### Added`, `### Changed`, `### Deprecated`, `### Removed`, `### Fixed` y `### Security` (solo las que apliquen). Si faltan entradas, `pnpm create-version` las redacta con Claude Code o Codex y las escribe sin confirmar (revisalas en la salida del comando); si ningún agente puede, bloquea el release mientras `[Unreleased]` no exista o no tenga entradas. Con `@astra-kit/rp` 1.0.0, el commit de versión renombra `[Unreleased]` a `## [X.Y.Z] - AAAA-MM-DD` (fecha en la hora de Argentina por `releaseTimeZone: "America/Argentina/Buenos_Aires"`, aunque el workflow **Release** corra en un runner en UTC) y deja un `[Unreleased]` vacío arriba; si el CHANGELOG no está en UTF-8, el release se detiene antes del bump. Ni las personas ni los hooks cierran la sección: hacerlo (por ejemplo con `releaseUnreleased`) la cerraría dos veces o dejaría `[Unreleased]` vacío y bloquearía el release. `release:prepare` exige el bloque fechado que coincide con la versión del manifiesto. La regla completa está en `AGENTS.md`.
|
|
368
|
+
|
|
369
|
+
Para validar y empaquetar la versión actual sin publicarla:
|
|
370
|
+
|
|
371
|
+
```sh
|
|
372
|
+
pnpm release:prepare
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
El paquete excluye fuentes privadas, tests, scripts, `.env` y `.npmrc`; incluye JavaScript, declaraciones, CSS, fuentes tipográficas y licencias. Conserva releases anteriores.
|
|
376
|
+
|
|
377
|
+
`prepack` ejecuta el build para los empaquetados manuales. `dist` y `releases` son generados e ignorados por Git. La CI verifica los checks, los tres providers y el catálogo de Storybook (`pnpm test:storybook`) en ambos motores de navegador en Linux y Windows. La publicación se ejecuta desde el workflow **Release**, que recibe la versión, el tag y el commit creados por `pnpm create-version`.
|
|
378
|
+
|
|
379
|
+
Tras publicar, los consumidores pueden instalar `pnpm add @astra-kit/ui`. También pueden instalar directamente el `.tgz` validado antes de una publicación.
|
|
380
|
+
|
|
381
|
+
Los componentes nuevos de shadcn/ui se agregan mediante su CLI en esta biblioteca y se exportan desde la raíz. No editar las copias instaladas en los consumidores.
|
|
382
|
+
|
|
383
|
+
## Procedencia
|
|
384
|
+
|
|
385
|
+
Fuentes originales: `guidomodarelli/TuTribu` (`components/ui`) y `agenda-mensual` (`src/components/ui`). Se preservan las funcionalidades y los comentarios que explican sus decisiones; la integración adapta imports, contratos y dependencias del consumidor. Consultar `LICENSE.md` para la licencia original de shadcn/ui y `assets/fonts/*-LICENSE.txt` para las fuentes. El icono de WhatsApp proviene del registry `@svgl`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
@astra-kit/ui includes code adapted from the following projects.
|
|
4
|
+
|
|
5
|
+
## Arc
|
|
6
|
+
|
|
7
|
+
The theme tokens (`theme.css`, from Arc's `foundation.css`) and the `Button` API, styles and motion (`src/components/button.tsx`, `src/components/button-label.tsx`, `src/components/control-button.tsx`, `src/motion/arc-press.ts`, `src/motion/arc-tokens.ts`, `src/motion/use-morph-width.ts`), and the `ActionButton` and `SplitButton` components and their label morph (`src/components/action-button.tsx`, `src/components/split-button.tsx`, `src/components/morph-text.tsx`), the `Input` and `Textarea` fields with their animated helper and error rows (`src/components/input.tsx`, `src/components/textarea.tsx`, `src/components/field.tsx`), the `Switch`, `Checkbox` and `RadioGroup` controls (`src/components/switch.tsx`, `src/components/checkbox.tsx`, `src/components/radio-group.tsx`, `src/constants/switch.ts`, `src/constants/checkbox.ts`, `src/constants/radio-group.ts`), the `Badge`, `Avatar`, `AvatarGroup`, `Skeleton`, `Card` and `Alert` displays (`src/components/badge.tsx`, `src/components/avatar.tsx`, `src/components/skeleton.tsx`, `src/components/card.tsx`, `src/components/alert.tsx`, `src/constants/avatar.ts`, `src/constants/card.ts`, `src/constants/alert.ts`), the `Tooltip`, `Popover` and `HoverCard` overlays and their motion (`src/components/tooltip.tsx`, `src/components/popover.tsx`, `src/components/hover-card.tsx`, `src/motion/arc-floating-slot.tsx`, `src/motion/overlay-warmth.ts`, `src/constants/tooltip.ts`, `src/constants/popover.ts`, `src/constants/hover-card.ts`), the `DropdownMenu` and `Select` menus (`src/components/dropdown-menu.tsx`, `src/components/select.tsx`), the `Tabs` and `Pagination` navigation (`src/components/tabs.tsx`, `src/components/pagination.tsx`, `src/constants/tabs.ts`), the `Dialog` surface and its `alert` mode (`src/components/dialog.tsx`, `src/components/dialog-surface.tsx`, `src/constants/dialog.ts`), the `Calendar` and `Carousel` (`src/components/calendar.tsx`, `src/components/carousel.tsx`, `src/constants/calendar.ts`, `src/constants/carousel.ts`, `src/hooks/use-today.ts`), and the internal compositions those public components are built on (`src/components/primitives/`) are adapted from the free Arc library: https://uiarc.dev, https://github.com/kuratlielia/arc-library
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 Elia Kuratli
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
https://openfontlicense.org
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
-----------------------------------------------------------
|
|
9
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
+
-----------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
PREAMBLE
|
|
13
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
+
development of collaborative font projects, to support the font creation
|
|
15
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
+
open framework in which fonts may be shared and improved in partnership
|
|
17
|
+
with others.
|
|
18
|
+
|
|
19
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
+
redistributed and/or sold with any software provided that any reserved
|
|
23
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
+
however, cannot be released under any other type of license. The
|
|
25
|
+
requirement for fonts to remain under this license does not apply
|
|
26
|
+
to any document created using the fonts or their derivatives.
|
|
27
|
+
|
|
28
|
+
DEFINITIONS
|
|
29
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
+
include source files, build scripts and documentation.
|
|
32
|
+
|
|
33
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
+
copyright statement(s).
|
|
35
|
+
|
|
36
|
+
"Original Version" refers to the collection of Font Software components as
|
|
37
|
+
distributed by the Copyright Holder(s).
|
|
38
|
+
|
|
39
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
+
new environment.
|
|
43
|
+
|
|
44
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
+
writer or other person who contributed to the Font Software.
|
|
46
|
+
|
|
47
|
+
PERMISSION & CONDITIONS
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
+
Software, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
1) Neither the Font Software nor any of its individual components,
|
|
54
|
+
in Original or Modified Versions, may be sold by itself.
|
|
55
|
+
|
|
56
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
+
redistributed and/or sold with any software, provided that each copy
|
|
58
|
+
contains the above copyright notice and this license. These can be
|
|
59
|
+
included either as stand-alone text files, human-readable headers or
|
|
60
|
+
in the appropriate machine-readable metadata fields within text or
|
|
61
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
+
|
|
63
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
+
presented to the users.
|
|
67
|
+
|
|
68
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
+
Software shall not be used to promote, endorse or advertise any
|
|
70
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
+
permission.
|
|
73
|
+
|
|
74
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
+
must be distributed entirely under this license, and must not be
|
|
76
|
+
distributed under any other license. The requirement for fonts to
|
|
77
|
+
remain under this license does not apply to any document created
|
|
78
|
+
using the Font Software.
|
|
79
|
+
|
|
80
|
+
TERMINATION
|
|
81
|
+
This license becomes null and void if any of the above conditions are
|
|
82
|
+
not met.
|
|
83
|
+
|
|
84
|
+
DISCLAIMER
|
|
85
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|