@dropi/ui 0.1.43 → 0.1.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/cjs/dropi-button.cjs.entry.js +19 -2
  2. package/dist/cjs/dropi-checkbox.cjs.entry.js +23 -2
  3. package/dist/cjs/dropi-country-selector.cjs.entry.js +15 -2
  4. package/dist/cjs/dropi-date-picker.cjs.entry.js +40 -4
  5. package/dist/cjs/dropi-input_3.cjs.entry.js +3 -3
  6. package/dist/cjs/dropi-otp-send-code.cjs.entry.js +22 -2
  7. package/dist/cjs/dropi-phone-input.cjs.entry.js +25 -2
  8. package/dist/cjs/dropi-radio-button.cjs.entry.js +18 -1
  9. package/dist/cjs/dropi-select.cjs.entry.js +1 -1
  10. package/dist/cjs/dropi-switch.cjs.entry.js +22 -1
  11. package/dist/cjs/dropi-text-area.cjs.entry.js +3 -3
  12. package/dist/cjs/dropi-ui.cjs.js +1 -1
  13. package/dist/cjs/loader.cjs.js +1 -1
  14. package/dist/collection/components/dropi-button/dropi-button.js +39 -2
  15. package/dist/collection/components/dropi-checkbox/dropi-checkbox.js +38 -2
  16. package/dist/collection/components/dropi-country-selector/dropi-country-selector.js +29 -2
  17. package/dist/collection/components/dropi-date-picker/dropi-date-picker.js +55 -4
  18. package/dist/collection/components/dropi-input/dropi-input.js +4 -4
  19. package/dist/collection/components/dropi-otp-send-code/dropi-otp-send-code.js +36 -2
  20. package/dist/collection/components/dropi-phone-input/dropi-phone-input.js +39 -2
  21. package/dist/collection/components/dropi-radio-button/dropi-radio-button.js +13 -2
  22. package/dist/collection/components/dropi-select/dropi-select.js +2 -2
  23. package/dist/collection/components/dropi-switch/dropi-switch.js +37 -1
  24. package/dist/collection/components/dropi-text-area/dropi-text-area.js +4 -4
  25. package/dist/components/dropi-alert-modal.js +1 -1
  26. package/dist/components/dropi-button.js +1 -1
  27. package/dist/components/dropi-card-checkbox.js +1 -1
  28. package/dist/components/dropi-card-section.js +1 -1
  29. package/dist/components/dropi-checkbox-selection-list.js +1 -1
  30. package/dist/components/dropi-checkbox.js +1 -1
  31. package/dist/components/dropi-country-selector.js +1 -1
  32. package/dist/components/dropi-date-picker.js +1 -1
  33. package/dist/components/dropi-dropdown.js +1 -1
  34. package/dist/components/dropi-empty-state.js +1 -1
  35. package/dist/components/dropi-file-upload.js +1 -1
  36. package/dist/components/dropi-input.js +1 -1
  37. package/dist/components/dropi-otp-send-code.js +1 -1
  38. package/dist/components/dropi-phone-input.js +1 -1
  39. package/dist/components/dropi-radio-button.js +1 -1
  40. package/dist/components/dropi-search.js +1 -1
  41. package/dist/components/dropi-select.js +1 -1
  42. package/dist/components/dropi-switch.js +1 -1
  43. package/dist/components/dropi-table.js +1 -1
  44. package/dist/components/dropi-text-area.js +1 -1
  45. package/dist/components/p-CCZ6rIo5.js +1 -0
  46. package/dist/components/p-Dd1g1gjR.js +1 -0
  47. package/dist/components/p-Dnx3uXgo.js +1 -0
  48. package/dist/components/p-Qrac2GRu.js +1 -0
  49. package/dist/dropi-ui/dropi-button.entry.js +19 -2
  50. package/dist/dropi-ui/dropi-button.entry.js.map +1 -1
  51. package/dist/dropi-ui/dropi-checkbox.entry.js +23 -2
  52. package/dist/dropi-ui/dropi-checkbox.entry.js.map +1 -1
  53. package/dist/dropi-ui/dropi-country-selector.entry.js +15 -2
  54. package/dist/dropi-ui/dropi-country-selector.entry.js.map +1 -1
  55. package/dist/dropi-ui/dropi-date-picker.entry.js +40 -4
  56. package/dist/dropi-ui/dropi-date-picker.entry.js.map +1 -1
  57. package/dist/dropi-ui/dropi-input.entry.js +3 -3
  58. package/dist/dropi-ui/dropi-input.entry.js.map +1 -1
  59. package/dist/dropi-ui/dropi-otp-send-code.entry.js +22 -2
  60. package/dist/dropi-ui/dropi-otp-send-code.entry.js.map +1 -1
  61. package/dist/dropi-ui/dropi-phone-input.entry.js +25 -2
  62. package/dist/dropi-ui/dropi-phone-input.entry.js.map +1 -1
  63. package/dist/dropi-ui/dropi-radio-button.entry.js +18 -1
  64. package/dist/dropi-ui/dropi-radio-button.entry.js.map +1 -1
  65. package/dist/dropi-ui/dropi-select.entry.js +1 -1
  66. package/dist/dropi-ui/dropi-select.entry.js.map +1 -1
  67. package/dist/dropi-ui/dropi-switch.entry.js +22 -1
  68. package/dist/dropi-ui/dropi-switch.entry.js.map +1 -1
  69. package/dist/dropi-ui/dropi-text-area.entry.js +3 -3
  70. package/dist/dropi-ui/dropi-text-area.entry.js.map +1 -1
  71. package/dist/dropi-ui/dropi-ui.esm.js +1 -1
  72. package/dist/dropi-ui/p-09462f7b.entry.js +1 -0
  73. package/dist/dropi-ui/p-42a85ce5.entry.js +1 -0
  74. package/dist/dropi-ui/p-43e21ed8.entry.js +1 -0
  75. package/dist/dropi-ui/p-532136cc.entry.js +1 -0
  76. package/dist/dropi-ui/p-9a569a4e.entry.js +1 -0
  77. package/dist/dropi-ui/p-b2e8c0e2.entry.js +1 -0
  78. package/dist/dropi-ui/p-bc6bb893.entry.js +1 -0
  79. package/dist/dropi-ui/p-c08b8995.entry.js +1 -0
  80. package/dist/dropi-ui/p-c6926604.entry.js +1 -0
  81. package/dist/dropi-ui/p-eaa10fe8.entry.js +1 -0
  82. package/dist/dropi-ui/p-fb4856ea.entry.js +1 -0
  83. package/dist/esm/dropi-button.entry.js +19 -2
  84. package/dist/esm/dropi-checkbox.entry.js +23 -2
  85. package/dist/esm/dropi-country-selector.entry.js +15 -2
  86. package/dist/esm/dropi-date-picker.entry.js +40 -4
  87. package/dist/esm/dropi-input_3.entry.js +3 -3
  88. package/dist/esm/dropi-otp-send-code.entry.js +22 -2
  89. package/dist/esm/dropi-phone-input.entry.js +25 -2
  90. package/dist/esm/dropi-radio-button.entry.js +18 -1
  91. package/dist/esm/dropi-select.entry.js +1 -1
  92. package/dist/esm/dropi-switch.entry.js +22 -1
  93. package/dist/esm/dropi-text-area.entry.js +3 -3
  94. package/dist/esm/dropi-ui.js +1 -1
  95. package/dist/esm/loader.js +1 -1
  96. package/dist/types/components/dropi-button/dropi-button.d.ts +4 -0
  97. package/dist/types/components/dropi-checkbox/dropi-checkbox.d.ts +5 -0
  98. package/dist/types/components/dropi-country-selector/dropi-country-selector.d.ts +3 -0
  99. package/dist/types/components/dropi-date-picker/dropi-date-picker.d.ts +6 -0
  100. package/dist/types/components/dropi-otp-send-code/dropi-otp-send-code.d.ts +3 -0
  101. package/dist/types/components/dropi-phone-input/dropi-phone-input.d.ts +5 -0
  102. package/dist/types/components/dropi-radio-button/dropi-radio-button.d.ts +3 -0
  103. package/dist/types/components/dropi-switch/dropi-switch.d.ts +5 -0
  104. package/dist/types/components.d.ts +109 -4
  105. package/hydrate/index.js +218 -43
  106. package/hydrate/index.mjs +218 -43
  107. package/package.json +1 -1
  108. package/readme.md +225 -6
  109. package/skills/update-context/skill.md +37 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dropi/ui",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "description": "Dropi Design System — Web Components for Angular, React and Vue",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
package/readme.md CHANGED
@@ -1,22 +1,25 @@
1
- # @dropi/ui
1
+ # @dropi/ui 🚀
2
2
 
3
3
  Librería de Web Components del Design System de Dropi, construida con **Stencil.js v4**.
4
- Genera componentes reutilizables para Angular, React y Vue desde una única base de código.
4
+ Genera componentes de alto rendimiento para **Angular**, **React** y **Next.js** desde una única base de código.
5
5
 
6
- - **Paquete npm:** `@dropi/ui` (v0.1.24)
7
- - **React wrappers:** `@dropi/ui-react` (v0.1.9)
6
+ - **Paquete npm:** [@dropi/ui](https://www.npmjs.com/package/@dropi/ui) (v0.1.44)
7
+ - **React wrappers:** [@dropi/ui-react](https://www.npmjs.com/package/@dropi/ui-react) (v0.1.18)
8
+
9
+ > [!NOTE]
10
+ > Esta es una librería de uso interno y para partners autorizados. La documentación detallada del código fuente reside en nuestro repositorio privado de Bitbucket.
8
11
 
9
12
  ---
10
13
 
11
14
  ## ⚡ Quick Start (Recomendado)
12
15
 
13
- Ejecuta este comando en la raíz de tu proyecto:
16
+ Si estás en un proyecto de React o Angular, la forma más rápida de configurar todo es:
14
17
 
15
18
  ```bash
16
19
  npx @dropi/ui setup
17
20
  ```
18
21
 
19
- Detecta tu framework (Angular, React, Next.js), instala las dependencias correctas e inyecta la configuración automáticamente.
22
+ Este comando detectará tu framework e instalará automáticamente las dependencias y configuraciones necesarias.
20
23
 
21
24
  ---
22
25
 
@@ -139,6 +142,40 @@ onOnInput={(e) => console.log(e.detail)}
139
142
 
140
143
  ---
141
144
 
145
+ ## 📋 Soporte para Formularios Nativos
146
+
147
+ Todos los componentes de entrada (`DropiInput`, `DropiSelect`, `DropiCheckbox`, `DropiSwitch`, `DropiPhoneInput`, `DropiCountrySelector`, `DropiOtpSendCode`) soportan la **asociación nativa a formularios**.
148
+
149
+ Esto permite capturar sus valores de forma instantánea usando el estándar del navegador:
150
+
151
+ ### Ejemplo en React (Estilo FormData)
152
+ ```tsx
153
+ const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
154
+ e.preventDefault();
155
+
156
+ // Extrae todos los valores automáticamente
157
+ const formData = new FormData(e.currentTarget);
158
+ const data = Object.fromEntries(formData.entries());
159
+
160
+ console.log(data); // { email: "...", country: "CO", phone: "+57..." }
161
+ };
162
+
163
+ return (
164
+ <form onSubmit={handleSubmit}>
165
+ <DropiInput name="email" label="Email" required />
166
+ <DropiCountrySelector name="country" label="País" />
167
+ <DropiPhoneInput name="phone" label="Celular" />
168
+
169
+ <DropiButton nativeType="submit" text="Enviar Registro" />
170
+ </form>
171
+ );
172
+ ```
173
+
174
+ > [!IMPORTANT]
175
+ > Para que un componente sea capturado por el formulario, **debe tener la prop `name`** definida.
176
+
177
+ ---
178
+
142
179
  ## Uso en React (Métodos Imperativos)
143
180
 
144
181
  Componentes como `DropiModal` y `DropiToast` tienen métodos que deben llamarse vía `ref`. Dado que los wrappers son generados, a veces es necesario castear a `any` para acceder a `show()` o `hide()`.
@@ -175,6 +212,8 @@ Botón de acción principal con múltiples variantes de tipo, apariencia, tamañ
175
212
  | `text` | `string` | `''` | Texto del label |
176
213
  | `preIcon` | `string` | `''` | Ícono antes del texto |
177
214
  | `postIcon` | `string` | `''` | Ícono después del texto |
215
+ | `nativeType` | `'button' \| 'submit' \| 'reset'` | `'button'` | Tipo de botón nativo HTML |
216
+
178
217
 
179
218
  **Eventos**
180
219
 
@@ -771,6 +810,89 @@ const [open, setOpen] = useState(false);
771
810
 
772
811
  ---
773
812
 
813
+ ---
814
+
815
+ ### `<dropi-phone-input>`
816
+
817
+ Input de teléfono con selector de país y sincronización nativa con `dropi-core_front`.
818
+
819
+ **Props**
820
+
821
+ | Prop | Tipo | Default | Descripción |
822
+ |---|---|---|---|
823
+ | `name` | `string` | `''` | Nombre para formularios nativos |
824
+ | `codArea` | `string` | `'57'` | Código de área inicial (sin +) |
825
+ | `ngModelPhone` | `string` | `''` | Valor del teléfono |
826
+ | `phoneNumberPlaceholder` | `string` | `null` | Placeholder del campo numérico |
827
+ | `disabledInput` | `boolean` | `false` | Deshabilita el input |
828
+ | `isValidPhone` | `boolean` | `undefined` | Estado de validación manual |
829
+
830
+ **Eventos**
831
+
832
+ | Evento React | `e.detail` | Cuándo |
833
+ |---|---|---|
834
+ | `onDropiCodChange` | `string` | Cambia el código de área |
835
+ | `onDropiPhoneChange` | `string` | Cambia el número de teléfono |
836
+
837
+ ---
838
+
839
+ ### `<dropi-country-selector>`
840
+
841
+ Selector de países con buscador y flags.
842
+
843
+ **Props**
844
+
845
+ | Prop | Tipo | Default | Descripción |
846
+ |---|---|---|---|
847
+ | `name` | `string` | `''` | Nombre para formularios nativos |
848
+ | `label` | `string` | `''` | Label superior |
849
+ | `placeholder` | `string` | `'Seleccionar'` | Texto por defecto |
850
+ | `currentSelection` | `string` | `''` | Código ISO del país seleccionado (ej. 'CO') |
851
+
852
+ **Eventos**
853
+
854
+ | Evento React | `e.detail` | Cuándo |
855
+ |---|---|---|
856
+ | `onDropiChangeSelect` | `CountryItem` | Se selecciona un país |
857
+
858
+ ---
859
+
860
+ ### `<dropi-otp-send-code>`
861
+
862
+ Campo de validación OTP (Código de seguridad).
863
+
864
+ **Props**
865
+
866
+ | Prop | Tipo | Default | Descripción |
867
+ |---|---|---|---|
868
+ | `name` | `string` | `''` | Nombre para formularios nativos |
869
+ | `digitsCount` | `number` | `6` | Cantidad de dígitos |
870
+ | `engine` | `'email' \| 'phone'` | `'email'` | Ícono y texto descriptivo |
871
+ | `labelContact` | `string` | `''` | Correo o Teléfono al que se envió |
872
+
873
+ **Eventos**
874
+
875
+ | Evento React | `e.detail` | Cuándo |
876
+ |---|---|---|
877
+ | `onCodeAccepted` | `string` | El código se ha completado |
878
+
879
+ ---
880
+
881
+ ### `<dropi-date-picker>`
882
+
883
+ Selector de fechas individual o por rangos.
884
+
885
+ **Props**
886
+
887
+ | Prop | Tipo | Default | Descripción |
888
+ |---|---|---|---|
889
+ | `name` | `string` | `''` | Nombre para formularios nativos |
890
+ | `label` | `string` | `''` | Label |
891
+ | `isRange` | `boolean` | `false` | Habilita selección de rango |
892
+ | `placeholder` | `string` | `''` | Placeholder |
893
+
894
+ ---
895
+
774
896
  ### `<dropi-toast>`
775
897
 
776
898
  Notificaciones tipo push con animaciones Lottie.
@@ -799,6 +921,103 @@ const Toast = DropiToast as any;
799
921
 
800
922
  ---
801
923
 
924
+ ## 🏛️ Catálogo Completo de Componentes (65)
925
+
926
+ A continuación se listan todos los componentes disponibles en la librería, organizados por su función principal.
927
+
928
+ ### ⌨️ Entradas y Formularios
929
+ | Componente | Función |
930
+ |---|---|
931
+ | `<dropi-input>` | Campo de texto versátil con validación |
932
+ | `<dropi-select>` | Selector avanzado (búsqueda, flags, multiselect) |
933
+ | `<dropi-text-area>` | Área de texto con contador |
934
+ | `<dropi-phone-input>` | Input de celular con selector de país |
935
+ | `<dropi-country-selector>` | Selector global de países |
936
+ | `<dropi-checkbox>` | Checkbox estilizado |
937
+ | `<dropi-switch>` | Interruptor On/Off |
938
+ | `<dropi-radio-button>` | Opción de selección única |
939
+ | `<dropi-otp-send-code>` | Campo de validación de código OTP |
940
+ | `<dropi-date-picker>` | Selector de fecha individual |
941
+ | `<dropi-date-picker-range>` | Selector de rangos de fecha |
942
+ | `<dropi-color-picker>` | Selector de colores |
943
+ | `<dropi-city-selector>` | Selector de ciudades por departamentos |
944
+ | `<dropi-file-upload>` | Zona de carga de archivos |
945
+ | `<dropi-checkbox-selection-list>` | Lista larga de checkboxes con buscador |
946
+ | `<dropi-radio-selection-list>` | Lista larga de radio buttons con buscador |
947
+ | `<dropi-search>` | Barra de búsqueda especializada |
948
+
949
+ ### 📊 Visualización de Datos y Status
950
+ | Componente | Función |
951
+ |---|---|
952
+ | `<dropi-table>` | Tabla de datos profesional (sort, filter, paginador) |
953
+ | `<dropi-badge>` | Estado de cuenta/usuario |
954
+ | `<dropi-badge-legacy>` | Badges de contador y estados legacy |
955
+ | `<dropi-tag>` | Etiquetas de colores y semánticas |
956
+ | `<dropi-tag-type-product>` | Tags específicos para tipos de producto |
957
+ | `<dropi-progress-bar>` | Barra de progreso visual |
958
+ | `<dropi-skeleton>` | Placeholder de carga (text, circle, rect) |
959
+ | `<dropi-avatars>` | Foto de perfil o iniciales |
960
+ | `<dropi-icon>` | Renderizador de íconos del sistema |
961
+ | `<dropi-ilustration-icon>` | Ilustraciones de estado White Label |
962
+ | `<dropi-logo>` | Logotipos oficiales de Dropi |
963
+ | `<dropi-chips>` | Etiquetas con opción de cierre |
964
+ | `<dropi-image-miniature>` | Galería de miniaturas de imágenes |
965
+ | `<dropi-country-flags>` | Renderizador de banderas por código |
966
+
967
+ ### 🔔 Feedback y Overlays
968
+ | Componente | Función |
969
+ |---|---|
970
+ | `<dropi-modal>` | Ventana de diálogo base |
971
+ | `<dropi-alert-modal>` | Modal de confirmación con Lottie |
972
+ | `<dropi-toast>` | Notificaciones push flotantes |
973
+ | `<dropi-alert>` | Banner de alerta (inline/flag) |
974
+ | `<dropi-alert-legacy>` | Alerta simple para compatibilidad Angular |
975
+ | `<dropi-drawer>` | Panel lateral deslizable |
976
+ | `<dropi-tooltip>` | Burbuja de información (hover) |
977
+ | `<dropi-tooltip-v2>` | Tooltip mejorado con posiciones avanzadas |
978
+ | `<dropi-empty-state>` | Pantalla "Sin resultados" con acciones |
979
+ | `<dropi-banner-external>` | Banner publicitario/informativo externo |
980
+ | `<dropi-lottie-loader>` | Cargador animado Lottie genérico |
981
+
982
+ ### 🗺️ Navegación y Estructura
983
+ | Componente | Función |
984
+ |---|---|
985
+ | `<dropi-navbar>` | Barra de navegación superior |
986
+ | `<dropi-sidebar>` | Menú lateral de navegación |
987
+ | `<dropi-tabs>` | Sistema de pestañas con contadores |
988
+ | `<dropi-breadcrumb>` | Migas de pan para navegación |
989
+ | `<dropi-paginator>` | Control de páginas para listas |
990
+ | `<dropi-steps>` | Indicador de pasos horizontal |
991
+ | `<dropi-vertical-steps>` | Indicador de pasos vertical |
992
+ | `<dropi-simple-stepper>` | Stepper simplificado para flujos rápidos |
993
+ | `<dropi-accordion>` | Acordeón simple |
994
+ | `<dropi-accordion-item>` | Item individual de acordeón |
995
+
996
+ ### 🎥 Multimedia y Otros
997
+ | Componente | Función |
998
+ |---|---|
999
+ | `<dropi-media-player>` | Reproductor de Audio/Video personalizado |
1000
+ | `<dropi-youtube-lazy-video>` | Carga diferida de videos de YT |
1001
+ | `<dropi-image-overlay>` | Visualizador de imagen a pantalla completa |
1002
+ | `<dropi-read-more>` | Truncado de texto con "Ver más" |
1003
+ | `<dropi-time-line>` | Línea de tiempo de eventos/tracking |
1004
+ | `<dropi-file-upload-progress-bar>` | Barra de progreso individual por archivo |
1005
+ | `<dropi-carousel>` | Carrusel de imágenes/contenido |
1006
+
1007
+ ---
1008
+
1009
+ ## 🤖 AI Skills & Automation
1010
+
1011
+ Esta librería está diseñada para ser mantenida por IAs (Claude Code, Cursor, Windsurf).
1012
+
1013
+ ## Skills Universales (Compatibles con Claude, Cursor, Windsurf)
1014
+
1015
+ Todos los skills han sido estandarizados en la carpeta `/skills`.
1016
+ - `/install-dropi-ui` — `skills/install-dropi-ui/skill.md`
1017
+ - `/update-context` — `skills/update-context/skill.md`
1018
+
1019
+ ---
1020
+
802
1021
  ## Build (desarrollo)
803
1022
 
804
1023
  ```bash
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: update-context
3
+ description: Instrucciones universales para actualizar el contexto del proyecto (api.md, resumen.md, arquitectura.md)
4
+ ---
5
+
6
+ # Universal Skill: /update-context
7
+
8
+ Este archivo es la fuente de verdad para que cualquier IA (Claude, Cursor, Windsurf, Copilot) mantenga la documentación del proyecto al día.
9
+
10
+ ## 📜 Objetivo
11
+ Mantener los archivos en la carpeta `context/` sincronizados con el código real, especialmente tras cambios masivos o nuevas funcionalidades (como la de 65 componentes y Formularios Nativos).
12
+
13
+ ## 🛠️ Procedimiento Obligatorio
14
+
15
+ 1. **Analizar cambios recientes**:
16
+ - `git log -n 10 --oneline` (Ver qué se hizo)
17
+ - `git diff HEAD~5 --name-only` (Ver qué archivos cambiaron)
18
+
19
+ 2. **Verificar Archivos de Contexto**:
20
+ - `context/resumen.md`: Debe contener el historial de hoy.
21
+ - `context/api.md`: Debe listar los componentes actuales (65+).
22
+ - `context/arquitectura.md`: Debe reflejar patrones como "Form Associated".
23
+
24
+ 3. **Actualización Absoluta**:
25
+ - Si se detecta un componente nuevo, se DEBE agregar a `api.md`.
26
+ - Si se detecta un patrón nuevo (ej. `ElementInternals`), se DEBE documentar en `arquitectura.md`.
27
+ - La fecha de actualización debe ser `YYYY-MM-DD`.
28
+
29
+ ## 🤖 Guía para IAs (Prompt Injection)
30
+ Cuando el usuario pida "actualiza el contexto" o use el comando `/update-context`, la IA DEBE:
31
+ - Leer este archivo.
32
+ - Realizar los pasos de análisis.
33
+ - Aplicar los `replace_file_content` necesarios.
34
+ - Reportar un resumen de qué archivos de contexto fueron "sincronizados".
35
+
36
+ ---
37
+ *Dropi UI Documentation System — 2026*