@hopgoldy/cube-ui 0.2.0 → 0.3.1

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/README.md CHANGED
@@ -86,8 +86,20 @@ export const LoginPage = () => (
86
86
 
87
87
  `CubeSearchPage` is the shared search-page shell: desktop `Input.Search` plus optional filters, a mobile action bar (back, optional filter drawer, search), and pending / loading / empty states via `EmptyTip`. Apps pass result rows as children and filter UI (for example `ColorList`) through the `filters` slot — item cards and data fetching stay in the app.
88
88
 
89
+ `CubeLoginPage` is the shared full-screen login chrome: title, optional subtitle, optional header extra (failure alerts), and a centered body slot. Auth, KDF, and device-gate logic stay in the app.
90
+
91
+ ```tsx
92
+ import { CubeLoginPage } from "@hopgoldy/cube-ui";
93
+
94
+ <CubeLoginPage title="Cube Password" subtitle="安全可靠的密码管理器">
95
+ <LoginForm />
96
+ </CubeLoginPage>
97
+ ```
98
+
99
+ `ColorPicker` is a modal around `ColorList`.
100
+
89
101
  ```tsx
90
- import { ColorList, CubeSearchPage } from "@hopgoldy/cube-ui";
102
+ import { ColorList, ColorPicker, CubeSearchPage } from "@hopgoldy/cube-ui";
91
103
 
92
104
  <CubeSearchPage
93
105
  keyword={keyword}
package/dist/index.css CHANGED
@@ -351,4 +351,85 @@ html.dark .cube-color-dot-selected:hover,
351
351
  .cube-search-page-results {
352
352
  width: 100%;
353
353
  }
354
+
355
+ /* src/login-page/login-page.css */
356
+ .cube-login-page {
357
+ box-sizing: border-box;
358
+ width: 100vw;
359
+ height: 100vh;
360
+ display: flex;
361
+ flex-direction: column;
362
+ justify-content: center;
363
+ align-items: center;
364
+ background: #f3f4f6;
365
+ color: #111827;
366
+ }
367
+ html.dark .cube-login-page,
368
+ [data-theme=dark] .cube-login-page {
369
+ background: #262626;
370
+ color: #f3f4f6;
371
+ }
372
+ .cube-login-page-header {
373
+ width: 100vw;
374
+ text-align: center;
375
+ min-height: 236px;
376
+ }
377
+ .cube-login-page-title {
378
+ font-size: 3rem;
379
+ line-height: 1.1;
380
+ font-weight: 700;
381
+ }
382
+ .cube-login-page-subtitle {
383
+ margin-top: 1rem;
384
+ font-size: 1.25rem;
385
+ line-height: 1.75rem;
386
+ }
387
+ html.dark .cube-login-page-title,
388
+ [data-theme=dark] .cube-login-page-title {
389
+ color: #e5e5e5;
390
+ }
391
+ html.dark .cube-login-page-subtitle,
392
+ [data-theme=dark] .cube-login-page-subtitle {
393
+ color: #d4d4d4;
394
+ }
395
+ .cube-login-page-header-extra {
396
+ width: 70%;
397
+ margin: 1.5rem auto 0;
398
+ }
399
+ .cube-login-page-body {
400
+ width: 70%;
401
+ display: flex;
402
+ flex-direction: column;
403
+ align-items: center;
404
+ }
405
+ .cube-login-page-body > * {
406
+ width: 100%;
407
+ }
408
+ .cube-login-page-body-wide {
409
+ width: 80%;
410
+ }
411
+ @media (min-width: 768px) {
412
+ .cube-login-page-body {
413
+ width: 40%;
414
+ }
415
+ .cube-login-page-body-wide {
416
+ width: 60%;
417
+ }
418
+ }
419
+ @media (min-width: 1024px) {
420
+ .cube-login-page-body {
421
+ width: 30%;
422
+ }
423
+ .cube-login-page-body-wide {
424
+ width: 45%;
425
+ }
426
+ }
427
+ @media (min-width: 1280px) {
428
+ .cube-login-page-body {
429
+ width: 20%;
430
+ }
431
+ .cube-login-page-body-wide {
432
+ width: 35%;
433
+ }
434
+ }
354
435
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles.css","../src/app-header/app-header.css","../src/account-menu/account-menu.css","../src/about-dialog/about-dialog.css","../src/cube-app/cube-app.css","../src/mobile-account-sheet/mobile-account-sheet.css","../src/loading/loading.css","../src/page/page.css","../src/empty-tip/empty-tip.css","../src/color-list/color-list.css","../src/search-page/search-page.css"],"sourcesContent":[":root {\n --cube-header-height: 3rem;\n --cube-sidebar-width: 15rem;\n --cube-mobile-action-height: 40px;\n --cube-border-color: #d1d5db;\n --cube-dark-border-color: #374151;\n --cube-surface-color: #ffffff;\n --cube-dark-surface-color: #141414;\n}\n",".cube-app-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: var(--cube-header-height, 3rem);\n padding: 0.5rem 1rem;\n overflow: hidden;\n box-sizing: border-box;\n color: inherit;\n background: var(--cube-surface-color, #fff);\n border-bottom: 1px solid var(--cube-border-color, #d1d5db);\n transition: color 200ms ease, background-color 200ms ease,\n border-color 200ms ease;\n}\n\n.dark .cube-app-header,\n[data-theme=\"dark\"] .cube-app-header {\n background: var(--cube-dark-surface-color, #141414);\n border-bottom-color: var(--cube-dark-border-color, #374151);\n}\n\n.cube-app-header-leading {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n}\n\n.cube-app-header-toggle {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0 1rem 0 0;\n font: inherit;\n font-size: 1.25rem;\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.cube-app-header-toggle:focus-visible {\n outline: 2px solid #1677ff;\n outline-offset: 3px;\n border-radius: 2px;\n}\n\n.cube-app-header-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cube-app-header-actions {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n gap: 0.5rem;\n margin-left: 0.5rem;\n}\n",".cube-account-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n margin: 0;\n font: inherit;\n font-size: 1.25rem;\n line-height: 1;\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.cube-account-trigger:focus-visible {\n outline: 2px solid #1677ff;\n outline-offset: 3px;\n border-radius: 50%;\n}\n\n.cube-account-menu {\n width: 16rem;\n max-width: calc(100vw - 2rem);\n}\n\n.cube-account-menu-stats {\n display: flex;\n justify-content: space-around;\n gap: 1rem;\n margin-bottom: 1rem;\n}\n\n.cube-account-menu-items {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.cube-account-menu-footer {\n margin-top: 0.5rem;\n}\n",".cube-about-body {\n margin-bottom: 1rem;\n}\n\n.cube-about-description {\n margin: 1rem 0 0.5rem;\n font-size: 1rem;\n line-height: 1.5;\n}\n\n.cube-about-item {\n padding: 0.5rem;\n color: #6b7280;\n background: #f3f4f6;\n border-radius: 0.375rem;\n}\n\n.dark .cube-about-item,\n[data-theme=\"dark\"] .cube-about-item {\n color: #e5e7eb;\n background: #262626;\n}\n\n.cube-about-item-label {\n color: inherit;\n white-space: nowrap;\n}\n\n.cube-about-item-value {\n min-width: 0;\n overflow: hidden;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cube-about-link {\n color: inherit;\n text-decoration: none;\n}\n\n.cube-about-powered-by {\n color: #6b7280;\n}\n\n.dark .cube-about-powered-by,\n[data-theme=\"dark\"] .cube-about-powered-by {\n color: #e5e7eb;\n}\n",".cube-app-root {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.cube-app-sidebar {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n overflow: hidden;\n transition: width 200ms ease;\n}\n\n.cube-app-sidebar-top,\n.cube-app-sidebar-bottom {\n flex-shrink: 0;\n}\n\n.cube-app-sidebar-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n}\n\n.cube-app-desktop-area {\n flex-grow: 1;\n min-width: 0;\n height: 100%;\n overflow: hidden;\n transition: width 200ms ease;\n}\n\n.cube-app-content {\n height: calc(100% - var(--cube-header-height, 3rem) - 1px);\n overflow-y: auto;\n}\n\n.cube-app-search-button {\n width: 15rem;\n}\n\n.cube-app-mobile-root {\n width: 100vw;\n height: 100%;\n overflow: hidden;\n}\n\n.cube-app-mobile-content {\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n",".cube-sheet-card {\n padding: 0.5rem 0.75rem;\n background: var(--cube-surface-color, #fff);\n border: 1px solid var(--cube-border-color, #d1d5db);\n border-radius: 0.5rem;\n}\n\n.dark .cube-sheet-card,\n[data-theme=\"dark\"] .cube-sheet-card {\n background: var(--cube-dark-surface-color, #141414);\n border-color: var(--cube-dark-border-color, #374151);\n}\n\n.cube-sheet-cell {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 0.375rem 0;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.cube-sheet-split-line {\n height: 1px;\n margin: 0.25rem 0;\n background: var(--cube-border-color, #d1d5db);\n}\n\n.dark .cube-sheet-split-line,\n[data-theme=\"dark\"] .cube-sheet-split-line {\n background: var(--cube-dark-border-color, #374151);\n}\n",".cube-page-loading {\n width: 100%;\n height: 100%;\n}\n\n.cube-delayed-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n margin: 1.5rem 0;\n}\n\n.dark .cube-delayed-loading,\n[data-theme=\"dark\"] .cube-delayed-loading {\n color: #9ca3af;\n}\n",".cube-page-container {\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.cube-page-content {\n position: relative;\n height: 100%;\n overflow-y: auto;\n}\n\n@media (max-width: 767px) {\n .cube-page-content {\n height: calc(100% - var(--cube-mobile-action-height, 40px) - 1rem);\n }\n}\n\n.cube-page-action-bar {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.5rem;\n height: var(--cube-mobile-action-height, 40px);\n padding: 0.5rem;\n}\n\n.cube-page-action-icon {\n flex-shrink: 0;\n}\n\n.cube-page-action-search {\n flex: 1;\n min-width: 0;\n}\n",".cube-empty-tip-title {\n font-weight: 700;\n font-size: 1rem;\n}\n\n.cube-empty-tip-subtitle {\n color: #9ca3af;\n}\n",".cube-color-dot {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: none;\n border-radius: 9999px;\n cursor: pointer;\n transition: box-shadow 0.15s ease;\n}\n\n.cube-color-dot:hover {\n box-shadow: 0 0 0 4px #d1d5db;\n}\n\nhtml.dark .cube-color-dot:hover,\n[data-theme=\"dark\"] .cube-color-dot:hover {\n box-shadow: 0 0 0 4px #737373;\n}\n\n.cube-color-dot-selected {\n box-shadow: 0 0 0 4px #9ca3af;\n}\n\n.cube-color-dot-selected:hover {\n box-shadow: 0 0 0 4px #9ca3af;\n}\n\nhtml.dark .cube-color-dot-selected,\n[data-theme=\"dark\"] .cube-color-dot-selected,\nhtml.dark .cube-color-dot-selected:hover,\n[data-theme=\"dark\"] .cube-color-dot-selected:hover {\n box-shadow: 0 0 0 4px #4b5563;\n}\n\n.cube-color-dot-clear {\n border: 2px solid #ef4444;\n position: relative;\n overflow: hidden;\n background-color: transparent;\n}\n\n.cube-color-dot-clear::after {\n content: \"\";\n position: absolute;\n left: -1px;\n top: 10px;\n width: 25px;\n height: 2px;\n background: #ef4444;\n transform: rotate(45deg);\n}\n",".cube-search-page {\n width: 100%;\n box-sizing: border-box;\n padding: 1rem;\n}\n\n.cube-search-page-input,\n.cube-search-page-results {\n width: 100%;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/styles.css","../src/app-header/app-header.css","../src/account-menu/account-menu.css","../src/about-dialog/about-dialog.css","../src/cube-app/cube-app.css","../src/mobile-account-sheet/mobile-account-sheet.css","../src/loading/loading.css","../src/page/page.css","../src/empty-tip/empty-tip.css","../src/color-list/color-list.css","../src/search-page/search-page.css","../src/login-page/login-page.css"],"sourcesContent":[":root {\n --cube-header-height: 3rem;\n --cube-sidebar-width: 15rem;\n --cube-mobile-action-height: 40px;\n --cube-border-color: #d1d5db;\n --cube-dark-border-color: #374151;\n --cube-surface-color: #ffffff;\n --cube-dark-surface-color: #141414;\n}\n",".cube-app-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: var(--cube-header-height, 3rem);\n padding: 0.5rem 1rem;\n overflow: hidden;\n box-sizing: border-box;\n color: inherit;\n background: var(--cube-surface-color, #fff);\n border-bottom: 1px solid var(--cube-border-color, #d1d5db);\n transition: color 200ms ease, background-color 200ms ease,\n border-color 200ms ease;\n}\n\n.dark .cube-app-header,\n[data-theme=\"dark\"] .cube-app-header {\n background: var(--cube-dark-surface-color, #141414);\n border-bottom-color: var(--cube-dark-border-color, #374151);\n}\n\n.cube-app-header-leading {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n}\n\n.cube-app-header-toggle {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0 1rem 0 0;\n font: inherit;\n font-size: 1.25rem;\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.cube-app-header-toggle:focus-visible {\n outline: 2px solid #1677ff;\n outline-offset: 3px;\n border-radius: 2px;\n}\n\n.cube-app-header-title {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cube-app-header-actions {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n gap: 0.5rem;\n margin-left: 0.5rem;\n}\n",".cube-account-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n margin: 0;\n font: inherit;\n font-size: 1.25rem;\n line-height: 1;\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.cube-account-trigger:focus-visible {\n outline: 2px solid #1677ff;\n outline-offset: 3px;\n border-radius: 50%;\n}\n\n.cube-account-menu {\n width: 16rem;\n max-width: calc(100vw - 2rem);\n}\n\n.cube-account-menu-stats {\n display: flex;\n justify-content: space-around;\n gap: 1rem;\n margin-bottom: 1rem;\n}\n\n.cube-account-menu-items {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.cube-account-menu-footer {\n margin-top: 0.5rem;\n}\n",".cube-about-body {\n margin-bottom: 1rem;\n}\n\n.cube-about-description {\n margin: 1rem 0 0.5rem;\n font-size: 1rem;\n line-height: 1.5;\n}\n\n.cube-about-item {\n padding: 0.5rem;\n color: #6b7280;\n background: #f3f4f6;\n border-radius: 0.375rem;\n}\n\n.dark .cube-about-item,\n[data-theme=\"dark\"] .cube-about-item {\n color: #e5e7eb;\n background: #262626;\n}\n\n.cube-about-item-label {\n color: inherit;\n white-space: nowrap;\n}\n\n.cube-about-item-value {\n min-width: 0;\n overflow: hidden;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.cube-about-link {\n color: inherit;\n text-decoration: none;\n}\n\n.cube-about-powered-by {\n color: #6b7280;\n}\n\n.dark .cube-about-powered-by,\n[data-theme=\"dark\"] .cube-about-powered-by {\n color: #e5e7eb;\n}\n",".cube-app-root {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.cube-app-sidebar {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n overflow: hidden;\n transition: width 200ms ease;\n}\n\n.cube-app-sidebar-top,\n.cube-app-sidebar-bottom {\n flex-shrink: 0;\n}\n\n.cube-app-sidebar-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n}\n\n.cube-app-desktop-area {\n flex-grow: 1;\n min-width: 0;\n height: 100%;\n overflow: hidden;\n transition: width 200ms ease;\n}\n\n.cube-app-content {\n height: calc(100% - var(--cube-header-height, 3rem) - 1px);\n overflow-y: auto;\n}\n\n.cube-app-search-button {\n width: 15rem;\n}\n\n.cube-app-mobile-root {\n width: 100vw;\n height: 100%;\n overflow: hidden;\n}\n\n.cube-app-mobile-content {\n width: 100%;\n height: 100%;\n overflow-y: auto;\n}\n",".cube-sheet-card {\n padding: 0.5rem 0.75rem;\n background: var(--cube-surface-color, #fff);\n border: 1px solid var(--cube-border-color, #d1d5db);\n border-radius: 0.5rem;\n}\n\n.dark .cube-sheet-card,\n[data-theme=\"dark\"] .cube-sheet-card {\n background: var(--cube-dark-surface-color, #141414);\n border-color: var(--cube-dark-border-color, #374151);\n}\n\n.cube-sheet-cell {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 0.375rem 0;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.cube-sheet-split-line {\n height: 1px;\n margin: 0.25rem 0;\n background: var(--cube-border-color, #d1d5db);\n}\n\n.dark .cube-sheet-split-line,\n[data-theme=\"dark\"] .cube-sheet-split-line {\n background: var(--cube-dark-border-color, #374151);\n}\n",".cube-page-loading {\n width: 100%;\n height: 100%;\n}\n\n.cube-delayed-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n margin: 1.5rem 0;\n}\n\n.dark .cube-delayed-loading,\n[data-theme=\"dark\"] .cube-delayed-loading {\n color: #9ca3af;\n}\n",".cube-page-container {\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.cube-page-content {\n position: relative;\n height: 100%;\n overflow-y: auto;\n}\n\n@media (max-width: 767px) {\n .cube-page-content {\n height: calc(100% - var(--cube-mobile-action-height, 40px) - 1rem);\n }\n}\n\n.cube-page-action-bar {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.5rem;\n height: var(--cube-mobile-action-height, 40px);\n padding: 0.5rem;\n}\n\n.cube-page-action-icon {\n flex-shrink: 0;\n}\n\n.cube-page-action-search {\n flex: 1;\n min-width: 0;\n}\n",".cube-empty-tip-title {\n font-weight: 700;\n font-size: 1rem;\n}\n\n.cube-empty-tip-subtitle {\n color: #9ca3af;\n}\n",".cube-color-dot {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0;\n border: none;\n border-radius: 9999px;\n cursor: pointer;\n transition: box-shadow 0.15s ease;\n}\n\n.cube-color-dot:hover {\n box-shadow: 0 0 0 4px #d1d5db;\n}\n\nhtml.dark .cube-color-dot:hover,\n[data-theme=\"dark\"] .cube-color-dot:hover {\n box-shadow: 0 0 0 4px #737373;\n}\n\n.cube-color-dot-selected {\n box-shadow: 0 0 0 4px #9ca3af;\n}\n\n.cube-color-dot-selected:hover {\n box-shadow: 0 0 0 4px #9ca3af;\n}\n\nhtml.dark .cube-color-dot-selected,\n[data-theme=\"dark\"] .cube-color-dot-selected,\nhtml.dark .cube-color-dot-selected:hover,\n[data-theme=\"dark\"] .cube-color-dot-selected:hover {\n box-shadow: 0 0 0 4px #4b5563;\n}\n\n.cube-color-dot-clear {\n border: 2px solid #ef4444;\n position: relative;\n overflow: hidden;\n background-color: transparent;\n}\n\n.cube-color-dot-clear::after {\n content: \"\";\n position: absolute;\n left: -1px;\n top: 10px;\n width: 25px;\n height: 2px;\n background: #ef4444;\n transform: rotate(45deg);\n}\n",".cube-search-page {\n width: 100%;\n box-sizing: border-box;\n padding: 1rem;\n}\n\n.cube-search-page-input,\n.cube-search-page-results {\n width: 100%;\n}\n",".cube-login-page {\n box-sizing: border-box;\n width: 100vw;\n height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background: #f3f4f6;\n color: #111827;\n}\n\nhtml.dark .cube-login-page,\n[data-theme=\"dark\"] .cube-login-page {\n background: #262626;\n color: #f3f4f6;\n}\n\n.cube-login-page-header {\n width: 100vw;\n text-align: center;\n min-height: 236px;\n}\n\n.cube-login-page-title {\n font-size: 3rem;\n line-height: 1.1;\n font-weight: 700;\n}\n\n.cube-login-page-subtitle {\n margin-top: 1rem;\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n\nhtml.dark .cube-login-page-title,\n[data-theme=\"dark\"] .cube-login-page-title {\n color: #e5e5e5;\n}\n\nhtml.dark .cube-login-page-subtitle,\n[data-theme=\"dark\"] .cube-login-page-subtitle {\n color: #d4d4d4;\n}\n\n.cube-login-page-header-extra {\n width: 70%;\n margin: 1.5rem auto 0;\n}\n\n.cube-login-page-body {\n width: 70%;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.cube-login-page-body > * {\n width: 100%;\n}\n\n.cube-login-page-body-wide {\n width: 80%;\n}\n\n@media (min-width: 768px) {\n .cube-login-page-body {\n width: 40%;\n }\n\n .cube-login-page-body-wide {\n width: 60%;\n }\n}\n\n@media (min-width: 1024px) {\n .cube-login-page-body {\n width: 30%;\n }\n\n .cube-login-page-body-wide {\n width: 45%;\n }\n}\n\n@media (min-width: 1280px) {\n .cube-login-page-body {\n width: 20%;\n }\n\n .cube-login-page-body-wide {\n width: 35%;\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -148,6 +148,17 @@ interface ColorListProps {
148
148
  /** Single-select color dots (includes a clear/empty option), matching Cube search filters. */
149
149
  declare const ColorList: ({ value, onChange, flexProps }: ColorListProps) => react.JSX.Element;
150
150
 
151
+ interface ColorPickerProps {
152
+ value?: string;
153
+ onChange?(value: string): void;
154
+ open: boolean;
155
+ onClose(): void;
156
+ /** Close the modal after a color is chosen. Default true. */
157
+ closeOnSelect?: boolean;
158
+ }
159
+ /** Modal wrapping ColorList. Used by certificate/tag/diary editors. */
160
+ declare const ColorPicker: ({ value, onChange, open, onClose, closeOnSelect, }: ColorPickerProps) => react.JSX.Element;
161
+
151
162
  interface CubeSearchPageProps {
152
163
  /** Last committed keyword; used as the search inputs' default value. */
153
164
  keyword?: string;
@@ -174,4 +185,16 @@ interface CubeSearchPageProps {
174
185
  }
175
186
  declare const CubeSearchPage: ({ keyword, placeholder, searchButtonLabel, onSearch, onBack, desktopHeaderLeft, filters, mobileFilterTitle, mobileFilterIcon, pending, loading, empty, pendingHint, loadingTitle, loadingHint, emptyTitle, emptyHint, children, }: CubeSearchPageProps) => react.JSX.Element;
176
187
 
177
- export { type AboutAppInfo, type AboutAuthorInfo, type AboutItem, type AccountMenuItem, type AccountMenuStat, ActionButton, ActionIcon, ActionSearch, ColorList, type ColorListProps, CubeApp, type CubeAppAboutInfo, type CubeAppContextValue, type CubeAppProps, CubeConfigProvider, type CubeConfigProviderProps, CubePage, type CubePageProps, CubeSearchPage, type CubeSearchPageProps, DEFAULT_MOBILE_BREAKPOINT, DelayedLoading, type DelayedLoadingProps, DesktopOnly, EmptyTip, type EmptyTipProps, MARK_COLORS, MARK_COLORS_MAP, MARK_COLORS_WITH_EMPTY, MobileAccountSheet, type MobileAccountSheetProps, MobileOnly, PageLoading, type PageLoadingProps, type ResponsiveProps, type UseMediaQueryOptions, getColorValue, useCubeAppContext, useCubeAppHeaderLeft, useIsMobile, useMediaQuery };
188
+ interface CubeLoginPageProps {
189
+ title: ReactNode;
190
+ subtitle?: ReactNode;
191
+ /** Content under the subtitle (login-failure alerts, …). */
192
+ headerExtra?: ReactNode;
193
+ children?: ReactNode;
194
+ /** form = password field width; wide = device-gate / longer copy. */
195
+ bodyWidth?: "form" | "wide";
196
+ }
197
+ /** Full-screen login/auth chrome: title, optional subtitle, centered body. */
198
+ declare const CubeLoginPage: ({ title, subtitle, headerExtra, children, bodyWidth, }: CubeLoginPageProps) => react.JSX.Element;
199
+
200
+ export { type AboutAppInfo, type AboutAuthorInfo, type AboutItem, type AccountMenuItem, type AccountMenuStat, ActionButton, ActionIcon, ActionSearch, ColorList, type ColorListProps, ColorPicker, type ColorPickerProps, CubeApp, type CubeAppAboutInfo, type CubeAppContextValue, type CubeAppProps, CubeConfigProvider, type CubeConfigProviderProps, CubeLoginPage, type CubeLoginPageProps, CubePage, type CubePageProps, CubeSearchPage, type CubeSearchPageProps, DEFAULT_MOBILE_BREAKPOINT, DelayedLoading, type DelayedLoadingProps, DesktopOnly, EmptyTip, type EmptyTipProps, MARK_COLORS, MARK_COLORS_MAP, MARK_COLORS_WITH_EMPTY, MobileAccountSheet, type MobileAccountSheetProps, MobileOnly, PageLoading, type PageLoadingProps, type ResponsiveProps, type UseMediaQueryOptions, getColorValue, useCubeAppContext, useCubeAppHeaderLeft, useIsMobile, useMediaQuery };
package/dist/index.js CHANGED
@@ -406,6 +406,7 @@ var CubeApp = ({
406
406
  // src/mobile-account-sheet/mobile-account-sheet.tsx
407
407
  import { Fragment as Fragment3 } from "react";
408
408
  import { Button as Button3, Drawer, Flex as Flex2, Statistic as Statistic2 } from "antd";
409
+ import { RightOutlined } from "@ant-design/icons";
409
410
  import { Fragment as Fragment4, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
410
411
  var Cell = ({ title, extra, onClick }) => onClick ? /* @__PURE__ */ jsxs5("button", { type: "button", className: "cube-sheet-cell", onClick, children: [
411
412
  /* @__PURE__ */ jsx7("span", { children: title }),
@@ -443,6 +444,7 @@ var MobileAccountSheet = ({ visible, onVisibleChange }) => {
443
444
  " \xA0",
444
445
  item.label
445
446
  ] }),
447
+ extra: /* @__PURE__ */ jsx7(RightOutlined, { className: "text-gray-400" }),
446
448
  onClick: () => {
447
449
  item.onClick?.();
448
450
  close();
@@ -455,6 +457,7 @@ var MobileAccountSheet = ({ visible, onVisibleChange }) => {
455
457
  Cell,
456
458
  {
457
459
  title: "\u767B\u51FA",
460
+ extra: /* @__PURE__ */ jsx7(RightOutlined, { className: "text-gray-400" }),
458
461
  onClick: () => {
459
462
  onLogoutBtnClick();
460
463
  close();
@@ -612,11 +615,38 @@ var ColorList = ({ value, onChange, flexProps }) => /* @__PURE__ */ jsx11(Flex5,
612
615
  colorCode || "clear"
613
616
  )) });
614
617
 
618
+ // src/color-picker/color-picker.tsx
619
+ import { Modal as Modal2 } from "antd";
620
+ import { jsx as jsx12 } from "react/jsx-runtime";
621
+ var ColorPicker = ({
622
+ value,
623
+ onChange,
624
+ open,
625
+ onClose,
626
+ closeOnSelect = true
627
+ }) => {
628
+ const onSelect = (next) => {
629
+ onChange?.(next);
630
+ if (closeOnSelect) onClose();
631
+ };
632
+ return /* @__PURE__ */ jsx12(
633
+ Modal2,
634
+ {
635
+ open,
636
+ onCancel: onClose,
637
+ footer: null,
638
+ closable: false,
639
+ styles: { body: { padding: 24 } },
640
+ children: /* @__PURE__ */ jsx12("div", { "data-testid": "color-picker", children: /* @__PURE__ */ jsx12(ColorList, { value, onChange: onSelect, flexProps: { gap: 24, justify: "center" } }) })
641
+ }
642
+ );
643
+ };
644
+
615
645
  // src/search-page/search-page.tsx
616
646
  import { useState as useState4 } from "react";
617
647
  import { Button as Button5, Col, Drawer as Drawer2, Flex as Flex6, Input as Input2, Row } from "antd";
618
648
  import { FilterOutlined, LeftOutlined } from "@ant-design/icons";
619
- import { Fragment as Fragment5, jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
649
+ import { Fragment as Fragment5, jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
620
650
  var CubeSearchPage = ({
621
651
  keyword = "",
622
652
  placeholder = "\u8BF7\u8F93\u5165\u5173\u952E\u5B57\uFF0C\u56DE\u8F66\u641C\u7D22",
@@ -641,15 +671,15 @@ var CubeSearchPage = ({
641
671
  const hasFilters = filters != null;
642
672
  const renderBody = () => {
643
673
  if (loading) {
644
- return /* @__PURE__ */ jsx12(EmptyTip, { title: loadingTitle, subTitle: loadingHint });
674
+ return /* @__PURE__ */ jsx13(EmptyTip, { title: loadingTitle, subTitle: loadingHint });
645
675
  }
646
676
  if (pending) {
647
- return /* @__PURE__ */ jsx12(EmptyTip, { subTitle: pendingHint });
677
+ return /* @__PURE__ */ jsx13(EmptyTip, { subTitle: pendingHint });
648
678
  }
649
679
  if (empty) {
650
- return /* @__PURE__ */ jsx12("div", { "data-testid": "search-empty-tip", children: /* @__PURE__ */ jsx12(EmptyTip, { title: emptyTitle, subTitle: emptyHint }) });
680
+ return /* @__PURE__ */ jsx13("div", { "data-testid": "search-empty-tip", children: /* @__PURE__ */ jsx13(EmptyTip, { title: emptyTitle, subTitle: emptyHint }) });
651
681
  }
652
- return /* @__PURE__ */ jsx12(
682
+ return /* @__PURE__ */ jsx13(
653
683
  Flex6,
654
684
  {
655
685
  vertical: true,
@@ -662,24 +692,24 @@ var CubeSearchPage = ({
662
692
  );
663
693
  };
664
694
  return /* @__PURE__ */ jsxs8(Fragment5, { children: [
665
- /* @__PURE__ */ jsx12(
695
+ /* @__PURE__ */ jsx13(
666
696
  CubePage,
667
697
  {
668
698
  desktopHeaderLeft,
669
699
  mobileActionBar: /* @__PURE__ */ jsxs8(Fragment5, { children: [
670
- /* @__PURE__ */ jsx12(ActionIcon, { icon: /* @__PURE__ */ jsx12(LeftOutlined, {}), "aria-label": "\u8FD4\u56DE", onClick: onBack }),
671
- hasFilters ? /* @__PURE__ */ jsx12(
700
+ /* @__PURE__ */ jsx13(ActionIcon, { icon: /* @__PURE__ */ jsx13(LeftOutlined, {}), "aria-label": "\u8FD4\u56DE", onClick: onBack }),
701
+ hasFilters ? /* @__PURE__ */ jsx13(
672
702
  ActionIcon,
673
703
  {
674
- icon: mobileFilterIcon ?? /* @__PURE__ */ jsx12(FilterOutlined, {}),
704
+ icon: mobileFilterIcon ?? /* @__PURE__ */ jsx13(FilterOutlined, {}),
675
705
  "aria-label": "\u6253\u5F00\u7B5B\u9009",
676
706
  onClick: () => setFilterOpen(true)
677
707
  }
678
708
  ) : null,
679
- /* @__PURE__ */ jsx12(ActionSearch, { defaultValue: keyword, onSearch })
709
+ /* @__PURE__ */ jsx13(ActionSearch, { defaultValue: keyword, onSearch })
680
710
  ] }),
681
711
  children: /* @__PURE__ */ jsxs8(Flex6, { vertical: true, gap: 16, align: "center", className: "cube-search-page", children: [
682
- /* @__PURE__ */ jsx12(DesktopOnly, { children: /* @__PURE__ */ jsx12(
712
+ /* @__PURE__ */ jsx13(DesktopOnly, { children: /* @__PURE__ */ jsx13(
683
713
  Input2.Search,
684
714
  {
685
715
  placeholder,
@@ -692,12 +722,12 @@ var CubeSearchPage = ({
692
722
  "data-testid": "search-keyword-input"
693
723
  }
694
724
  ) }),
695
- hasFilters ? /* @__PURE__ */ jsx12(DesktopOnly, { children: filters }) : null,
725
+ hasFilters ? /* @__PURE__ */ jsx13(DesktopOnly, { children: filters }) : null,
696
726
  renderBody()
697
727
  ] })
698
728
  }
699
729
  ),
700
- hasFilters ? /* @__PURE__ */ jsx12(MobileOnly, { children: /* @__PURE__ */ jsx12(
730
+ hasFilters ? /* @__PURE__ */ jsx13(MobileOnly, { children: /* @__PURE__ */ jsx13(
701
731
  Drawer2,
702
732
  {
703
733
  title: mobileFilterTitle,
@@ -709,19 +739,41 @@ var CubeSearchPage = ({
709
739
  footer: { padding: 8, border: "none" },
710
740
  header: { textAlign: "center", padding: 8 }
711
741
  },
712
- footer: /* @__PURE__ */ jsx12(Row, { gutter: 8, children: /* @__PURE__ */ jsx12(Col, { flex: "1", children: /* @__PURE__ */ jsx12(Button5, { block: true, size: "large", onClick: () => setFilterOpen(false), children: "\u786E\u5B9A" }) }) }),
713
- children: /* @__PURE__ */ jsx12(Flex6, { vertical: true, gap: 16, className: "cube-search-page-drawer", align: "center", children: filters })
742
+ footer: /* @__PURE__ */ jsx13(Row, { gutter: 8, children: /* @__PURE__ */ jsx13(Col, { flex: "1", children: /* @__PURE__ */ jsx13(Button5, { block: true, size: "large", onClick: () => setFilterOpen(false), children: "\u786E\u5B9A" }) }) }),
743
+ children: /* @__PURE__ */ jsx13(Flex6, { vertical: true, gap: 16, className: "cube-search-page-drawer", align: "center", children: filters })
714
744
  }
715
745
  ) }) : null
716
746
  ] });
717
747
  };
748
+
749
+ // src/login-page/login-page.tsx
750
+ import { jsx as jsx14, jsxs as jsxs9 } from "react/jsx-runtime";
751
+ var CubeLoginPage = ({
752
+ title,
753
+ subtitle,
754
+ headerExtra,
755
+ children,
756
+ bodyWidth = "form"
757
+ }) => {
758
+ const bodyClass = bodyWidth === "wide" ? "cube-login-page-body cube-login-page-body-wide" : "cube-login-page-body";
759
+ return /* @__PURE__ */ jsxs9("div", { className: "cube-login-page", "data-testid": "cube-login-page", children: [
760
+ /* @__PURE__ */ jsxs9("header", { className: "cube-login-page-header", children: [
761
+ /* @__PURE__ */ jsx14("div", { className: "cube-login-page-title", children: title }),
762
+ subtitle != null && subtitle !== "" ? /* @__PURE__ */ jsx14("div", { className: "cube-login-page-subtitle", children: subtitle }) : null,
763
+ headerExtra != null ? /* @__PURE__ */ jsx14("div", { className: "cube-login-page-header-extra", children: headerExtra }) : null
764
+ ] }),
765
+ children != null ? /* @__PURE__ */ jsx14("div", { className: bodyClass, children }) : null
766
+ ] });
767
+ };
718
768
  export {
719
769
  ActionButton,
720
770
  ActionIcon,
721
771
  ActionSearch,
722
772
  ColorList,
773
+ ColorPicker,
723
774
  CubeApp,
724
775
  CubeConfigProvider,
776
+ CubeLoginPage,
725
777
  CubePage,
726
778
  CubeSearchPage,
727
779
  DEFAULT_MOBILE_BREAKPOINT,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/responsive/responsive.tsx","../src/cube-config-provider/cube-config-provider.tsx","../src/cube-app/cube-app.tsx","../src/app-header/app-header.tsx","../src/account-menu/account-menu-button.tsx","../src/account-menu/account-menu.tsx","../src/about-dialog/about-dialog.tsx","../src/mobile-account-sheet/mobile-account-sheet.tsx","../src/loading/loading.tsx","../src/page/page.tsx","../src/empty-tip/empty-tip.tsx","../src/color-list/color-list.tsx","../src/search-page/search-page.tsx"],"sourcesContent":["import { type PropsWithChildren, type ReactNode, useCallback, useMemo, useSyncExternalStore } from \"react\";\n\nexport const DEFAULT_MOBILE_BREAKPOINT = 767;\n\nexport interface UseMediaQueryOptions {\n defaultMatches?: boolean;\n}\n\nexport interface ResponsiveProps extends PropsWithChildren {\n defaultMatches?: boolean;\n}\n\nexport const useMediaQuery = (query: string, options: UseMediaQueryOptions = {}): boolean => {\n const { defaultMatches = false } = options;\n const mediaQueryList = useMemo(\n () =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(query)\n : null,\n [query],\n );\n\n const subscribe = useCallback(\n (notify: () => void) => {\n if (!mediaQueryList) return () => undefined;\n mediaQueryList.addEventListener(\"change\", notify);\n return () => mediaQueryList.removeEventListener(\"change\", notify);\n },\n [mediaQueryList],\n );\n\n const getSnapshot = useCallback(\n () => mediaQueryList?.matches ?? defaultMatches,\n [defaultMatches, mediaQueryList],\n );\n const getServerSnapshot = useCallback(() => defaultMatches, [defaultMatches]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n};\n\nexport const useIsMobile = ({ defaultMatches }: UseMediaQueryOptions = {}): boolean =>\n useMediaQuery(`(max-width: ${DEFAULT_MOBILE_BREAKPOINT}px)`, { defaultMatches });\n\nexport const MobileOnly = ({ children, defaultMatches }: ResponsiveProps): ReactNode => {\n const isMobile = useIsMobile({ defaultMatches });\n return isMobile ? children : null;\n};\n\nexport const DesktopOnly = ({ children, defaultMatches }: ResponsiveProps): ReactNode => {\n const isMobile = useIsMobile({ defaultMatches });\n return isMobile ? null : children;\n};\n","import { useMemo, type ReactNode } from \"react\";\nimport { ConfigProvider } from \"antd\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { useIsMobile } from \"../responsive/responsive\";\n\nexport interface CubeConfigProviderProps {\n children: ReactNode;\n\n primaryColor?: string;\n}\n\nconst DEFAULT_PRIMARY_COLOR = \"#ec008c\";\n\n/**\n * Applies the fixed Cube antd configuration (`zh_CN` locale, `primaryColor` token, a larger\n * base font size on mobile) without rendering any application shell. Mount it on its own for\n * pages that should share the Cube theme but live outside `CubeApp` — `CubeApp` itself wraps\n * this component internally.\n */\nexport const CubeConfigProvider = ({ children, primaryColor }: CubeConfigProviderProps) => {\n const isMobile = useIsMobile();\n\n const theme = useMemo(\n () => ({\n token: {\n colorPrimary: primaryColor ?? DEFAULT_PRIMARY_COLOR,\n lineWidth: 2,\n controlOutlineWidth: 1,\n ...(isMobile ? { fontSize: 16 } : {}),\n },\n components: {\n Card: {\n colorBorderSecondary: \"var(--cube-border-color, #d1d5db)\",\n lineHeight: 1.6,\n },\n },\n }),\n [primaryColor, isMobile],\n );\n\n return (\n <ConfigProvider locale={zhCN} theme={theme}>\n {children}\n </ConfigProvider>\n );\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"antd\";\nimport { SearchOutlined, SmileOutlined } from \"@ant-design/icons\";\nimport { useIsMobile } from \"../responsive/responsive\";\nimport { CubeConfigProvider } from \"../cube-config-provider/cube-config-provider\";\nimport { AppHeader } from \"../app-header/app-header\";\nimport { AccountMenuButton } from \"../account-menu/account-menu-button\";\nimport { AccountMenu, type AccountMenuItem, type AccountMenuStat } from \"../account-menu/account-menu\";\nimport {\n AboutDialog,\n type AboutAppInfo,\n type AboutAuthorInfo,\n type AboutItem,\n} from \"../about-dialog/about-dialog\";\nimport \"./cube-app.css\";\n\nexport interface CubeAppAboutInfo extends AboutAppInfo {\n contactEmail?: string;\n author?: AboutAuthorInfo;\n items?: AboutItem[];\n}\n\nexport interface CubeAppContextValue {\n accountMenuStats?: AccountMenuStat[];\n accountMenuItems?: AccountMenuItem[];\n onLogoutBtnClick?(): void;\n userName?: ReactNode;\n openAbout(): void;\n setHeaderLeft(node: ReactNode): void;\n}\n\nconst CubeAppContext = createContext<CubeAppContextValue>({\n openAbout: () => undefined,\n setHeaderLeft: () => undefined,\n});\n\n/**\n * Reads the account/about configuration passed to `CubeApp`. Only needed by components\n * mounted elsewhere in the route tree (e.g. `MobileAccountSheet`) — `CubeApp` itself\n * already has this data as props.\n */\nexport const useCubeAppContext = (): CubeAppContextValue => useContext(CubeAppContext);\n\n/**\n * Lets the currently mounted page override `CubeApp`'s `headerLeft` slot. Resets to the\n * default `headerLeft` prop when the calling component unmounts.\n */\nexport const useCubeAppHeaderLeft = (node: ReactNode): void => {\n const { setHeaderLeft } = useCubeAppContext();\n\n useEffect(() => {\n setHeaderLeft(node);\n return () => setHeaderLeft(undefined);\n }, [node, setHeaderLeft]);\n};\n\nexport interface CubeAppProps {\n children: ReactNode;\n\n primaryColor?: string;\n\n accountMenuStats?: AccountMenuStat[];\n accountMenuItems?: AccountMenuItem[];\n onLogoutBtnClick?(): void;\n userName?: ReactNode;\n about: CubeAppAboutInfo;\n\n sidebarTop?: ReactNode;\n sidebarList?: ReactNode;\n sidebarBottom?: ReactNode;\n\n headerLeft?: ReactNode;\n headerRight?: ReactNode;\n headerSearchBtnLabel?: string;\n onHeaderSearchBtnClick?(): void;\n}\n\nconst SIDEBAR_WIDTH = \"var(--cube-sidebar-width, 15rem)\";\n\nexport const CubeApp = ({\n children,\n primaryColor,\n accountMenuStats,\n accountMenuItems,\n onLogoutBtnClick,\n userName,\n about,\n sidebarTop,\n sidebarList,\n sidebarBottom,\n headerLeft,\n headerRight,\n headerSearchBtnLabel,\n onHeaderSearchBtnClick,\n}: CubeAppProps) => {\n const isMobile = useIsMobile();\n const [collapsed, setCollapsed] = useState(false);\n const toggleSidebar = useCallback(() => setCollapsed((value) => !value), []);\n const [aboutOpen, setAboutOpen] = useState(false);\n const [headerLeftOverride, setHeaderLeftOverride] = useState<ReactNode>(undefined);\n\n const itemsWithAbout = useMemo<AccountMenuItem[]>(\n () => [\n ...(accountMenuItems ?? []),\n {\n key: \"cube-app-about\",\n label: \"关于\",\n icon: <SmileOutlined />,\n onClick: () => setAboutOpen(true),\n },\n ],\n [accountMenuItems],\n );\n\n const contextValue = useMemo<CubeAppContextValue>(\n () => ({\n accountMenuStats,\n accountMenuItems: itemsWithAbout,\n onLogoutBtnClick,\n userName,\n openAbout: () => setAboutOpen(true),\n setHeaderLeft: setHeaderLeftOverride,\n }),\n [accountMenuStats, itemsWithAbout, onLogoutBtnClick, userName],\n );\n\n const renderAccountMenuButton = () => (\n <AccountMenuButton\n content={({ close }) => (\n <AccountMenu\n stats={accountMenuStats}\n items={itemsWithAbout.map((item) => ({\n ...item,\n onClick: () => {\n item.onClick?.();\n close();\n },\n }))}\n footer={\n onLogoutBtnClick ? (\n <Button\n block\n danger\n aria-label=\"登出\"\n onClick={() => {\n onLogoutBtnClick();\n close();\n }}\n >\n 登出\n </Button>\n ) : undefined\n }\n />\n )}\n />\n );\n\n const renderShell = () => {\n if (isMobile) {\n return (\n <div className={\"cube-app-mobile-root\"} data-testid=\"cube-app-shell-mobile\">\n <main className={\"cube-app-mobile-content\"}>{children}</main>\n </div>\n );\n }\n\n const sidebarStyle: CSSProperties = {\n width: collapsed ? \"0px\" : SIDEBAR_WIDTH,\n };\n const contentStyle: CSSProperties = {\n width: collapsed ? \"100vw\" : `calc(100vw - ${SIDEBAR_WIDTH})`,\n };\n\n return (\n <div className={\"cube-app-root\"} data-testid=\"cube-app-shell\">\n <aside\n className={\"cube-app-sidebar\"}\n style={sidebarStyle}\n data-testid=\"cube-app-shell-sidebar\"\n aria-hidden={collapsed}\n >\n {sidebarTop ? <div className={\"cube-app-sidebar-top\"}>{sidebarTop}</div> : null}\n <div className={\"cube-app-sidebar-list\"}>{sidebarList}</div>\n {sidebarBottom ? <div className={\"cube-app-sidebar-bottom\"}>{sidebarBottom}</div> : null}\n </aside>\n <div className={\"cube-app-desktop-area\"} style={contentStyle}>\n <AppHeader\n title={headerLeftOverride ?? headerLeft}\n collapsed={collapsed}\n onToggleSidebar={toggleSidebar}\n actions={\n <>\n {headerRight}\n {onHeaderSearchBtnClick ? (\n <Button\n className={\"cube-app-search-button\"}\n icon={<SearchOutlined aria-hidden />}\n aria-label={headerSearchBtnLabel ?? \"\\u641c\\u7d22\"}\n onClick={onHeaderSearchBtnClick}\n >\n {headerSearchBtnLabel ?? \"\\u641c\\u7d22\"}\n </Button>\n ) : null}\n {renderAccountMenuButton()}\n </>\n }\n />\n <main className={\"cube-app-content\"}>{children}</main>\n </div>\n </div>\n );\n };\n\n return (\n <CubeConfigProvider primaryColor={primaryColor}>\n <CubeAppContext.Provider value={contextValue}>\n {renderShell()}\n <AboutDialog\n open={aboutOpen}\n onClose={() => setAboutOpen(false)}\n app={about}\n contactEmail={about.contactEmail}\n author={about.author}\n items={about.items}\n />\n </CubeAppContext.Provider>\n </CubeConfigProvider>\n );\n};\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { MenuFoldOutlined, MenuUnfoldOutlined } from \"@ant-design/icons\";\nimport \"./app-header.css\";\n\nexport interface AppHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: ReactNode;\n actions?: ReactNode;\n collapsed?: boolean;\n showSidebarToggle?: boolean;\n onToggleSidebar?(): void;\n}\n\nexport const AppHeader = ({\n title,\n actions,\n collapsed = false,\n onToggleSidebar,\n showSidebarToggle = onToggleSidebar !== undefined,\n className,\n ...headerProps\n}: AppHeaderProps) => {\n const label = collapsed ? \"展开侧边栏\" : \"收起侧边栏\";\n const ToggleIcon = collapsed ? MenuUnfoldOutlined : MenuFoldOutlined;\n\n return (\n <header className={[\"cube-app-header\", className].filter(Boolean).join(\" \")} {...headerProps}>\n <div className={\"cube-app-header-leading\"}>\n {showSidebarToggle ? (\n <button\n type=\"button\"\n className={\"cube-app-header-toggle\"}\n aria-label={label}\n aria-expanded={!collapsed}\n onClick={onToggleSidebar}\n >\n <ToggleIcon aria-hidden />\n </button>\n ) : null}\n <div className={\"cube-app-header-title\"}>{title}</div>\n </div>\n {actions ? <div className={\"cube-app-header-actions\"}>{actions}</div> : null}\n </header>\n );\n};\n","import { type ReactNode, useState } from \"react\";\nimport { UserOutlined } from \"@ant-design/icons\";\nimport { Popover } from \"antd\";\nimport \"./account-menu.css\";\n\nexport interface AccountMenuRenderContext {\n close(): void;\n}\n\nexport interface AccountMenuButtonProps {\n content: ReactNode | ((context: AccountMenuRenderContext) => ReactNode);\n}\n\nexport const AccountMenuButton = ({ content }: AccountMenuButtonProps) => {\n const [open, setOpen] = useState(false);\n const close = () => setOpen(false);\n const renderedContent = typeof content === \"function\" ? content({ close }) : content;\n\n return (\n <Popover\n placement=\"bottomRight\"\n trigger=\"click\"\n content={renderedContent}\n open={open}\n onOpenChange={setOpen}\n arrow\n >\n <button\n type=\"button\"\n className={\"cube-account-trigger\"}\n aria-label=\"打开用户菜单\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n >\n <UserOutlined aria-hidden />\n </button>\n </Popover>\n );\n};\n","import type { Key, ReactNode } from \"react\";\nimport { Button, Statistic } from \"antd\";\nimport \"./account-menu.css\";\n\nexport interface AccountMenuStat {\n key: Key;\n title: ReactNode;\n value: string | number;\n icon?: ReactNode;\n}\n\nexport interface AccountMenuItem {\n key: Key;\n label: ReactNode;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: boolean;\n onClick?(): void;\n}\n\nexport interface AccountMenuProps {\n stats?: AccountMenuStat[];\n items?: AccountMenuItem[];\n footer?: ReactNode;\n}\n\nexport const AccountMenu = ({ stats = [], items = [], footer }: AccountMenuProps) => (\n <div className={\"cube-account-menu\"}>\n {stats.length > 0 ? (\n <div className={\"cube-account-menu-stats\"}>\n {stats.map((stat) => (\n <Statistic key={stat.key} title={stat.title} value={stat.value} prefix={stat.icon} />\n ))}\n </div>\n ) : null}\n {items.length > 0 ? (\n <div className={\"cube-account-menu-items\"}>\n {items.map((item) => (\n <Button\n key={item.key}\n block\n icon={item.icon}\n danger={item.danger}\n disabled={item.disabled}\n aria-label={typeof item.label === \"string\" ? item.label : undefined}\n onClick={item.onClick}\n >\n {item.label}\n </Button>\n ))}\n </div>\n ) : null}\n {footer ? <div className={\"cube-account-menu-footer\"}>{footer}</div> : null}\n </div>\n);\n","import type { Key, ReactNode } from \"react\";\nimport { BarcodeOutlined, GithubOutlined, SendOutlined } from \"@ant-design/icons\";\nimport { Flex, Modal } from \"antd\";\nimport \"./about-dialog.css\";\n\nexport interface AboutAppInfo {\n name: string;\n version?: string;\n repository?: string;\n description?: ReactNode;\n}\n\nexport interface AboutAuthorInfo {\n name: string;\n url?: string;\n}\n\nexport interface AboutItem {\n key: Key;\n icon?: ReactNode;\n label: ReactNode;\n value: ReactNode;\n href?: string;\n}\n\nexport interface AboutDialogProps {\n open: boolean;\n onClose(): void;\n app: AboutAppInfo;\n contactEmail?: string;\n author?: AboutAuthorInfo;\n items?: AboutItem[];\n}\n\nconst renderItem = (item: AboutItem) => {\n const content = (\n <div className={\"cube-about-item\"}>\n <Flex justify=\"space-between\" gap={16}>\n <div className={\"cube-about-item-label\"}>\n {item.icon ? <>{item.icon} &nbsp;</> : null}\n {item.label}\n </div>\n <div className={\"cube-about-item-value\"}>{item.value}</div>\n </Flex>\n </div>\n );\n\n return item.href ? (\n <a key={item.key} href={item.href} className={\"cube-about-link\"}>\n {content}\n </a>\n ) : (\n <div key={item.key}>{content}</div>\n );\n};\n\nexport const AboutDialog = ({\n open,\n onClose,\n app,\n contactEmail,\n author,\n items = [],\n}: AboutDialogProps) => {\n const defaultItems: AboutItem[] = [];\n\n if (contactEmail) {\n defaultItems.push({\n key: \"contact\",\n icon: <SendOutlined />,\n label: \"联系我\",\n value: contactEmail,\n href: `mailto:${contactEmail}?&subject=${encodeURIComponent(\n `${app.name} 相关`,\n )}`,\n });\n }\n\n if (app.version) {\n defaultItems.push({\n key: \"version\",\n icon: <BarcodeOutlined />,\n label: \"当前版本\",\n value: app.version,\n });\n }\n\n if (app.repository) {\n defaultItems.push({\n key: \"repository\",\n icon: <GithubOutlined />,\n label: \"开源地址\",\n value: \"github\",\n href: app.repository,\n });\n }\n\n const renderedItems = [...defaultItems, ...items];\n\n return (\n <Modal\n open={open}\n onCancel={onClose}\n onOk={onClose}\n title={`关于应用 ${app.name}`}\n footer={(_, { OkBtn }) => (\n <Flex\n align=\"center\"\n justify={author ? \"space-between\" : \"flex-end\"}\n gap={16}\n >\n {author ? (\n <div className={\"cube-about-powered-by\"}>\n Powered by 💗{\" \"}\n {author.url ? (\n <a href={author.url}>{author.name}</a>\n ) : (\n author.name\n )}\n </div>\n ) : null}\n <OkBtn />\n </Flex>\n )}\n >\n <Flex gap={16} vertical className={\"cube-about-body\"}>\n {app.description ? (\n <div className={\"cube-about-description\"}>{app.description}</div>\n ) : null}\n {renderedItems.map(renderItem)}\n </Flex>\n </Modal>\n );\n};\n","import { Fragment, type ReactNode } from \"react\";\nimport { Button, Drawer, Flex, Statistic } from \"antd\";\nimport { useCubeAppContext } from \"../cube-app/cube-app\";\nimport \"./mobile-account-sheet.css\";\n\nexport interface MobileAccountSheetProps {\n visible: boolean;\n onVisibleChange(visible: boolean): void;\n}\n\ninterface CellProps {\n title: ReactNode;\n extra?: ReactNode;\n onClick?(): void;\n}\n\nconst Cell = ({ title, extra, onClick }: CellProps) =>\n onClick ? (\n <button type=\"button\" className={\"cube-sheet-cell\"} onClick={onClick}>\n <span>{title}</span>\n {extra ? <span>{extra}</span> : null}\n </button>\n ) : (\n <div className={\"cube-sheet-cell\"}>\n <span>{title}</span>\n {extra ? <span>{extra}</span> : null}\n </div>\n );\n\nexport const MobileAccountSheet = ({ visible, onVisibleChange }: MobileAccountSheetProps) => {\n const { accountMenuStats, accountMenuItems, onLogoutBtnClick, userName } = useCubeAppContext();\n const close = () => onVisibleChange(false);\n\n return (\n <Drawer\n open={visible}\n onClose={close}\n placement=\"left\"\n width=\"100%\"\n closable={false}\n styles={{\n header: { display: \"none\" },\n body: { padding: 12 },\n footer: { padding: 8, borderTop: \"none\" },\n }}\n footer={\n <Button block size=\"large\" type=\"primary\" aria-label=\"返回\" onClick={close}>\n 返回\n </Button>\n }\n >\n <Flex vertical gap={12}>\n {accountMenuStats && accountMenuStats.length > 0 ? (\n <div className={\"cube-sheet-card\"}>\n <Flex justify=\"space-around\">\n {accountMenuStats.map((stat) => (\n <Statistic key={stat.key} title={stat.title} value={stat.value} prefix={stat.icon} />\n ))}\n </Flex>\n </div>\n ) : null}\n\n {userName ? (\n <div className={\"cube-sheet-card\"}>\n <Cell title=\"登录用户\" extra={userName} />\n </div>\n ) : null}\n\n {accountMenuItems && accountMenuItems.length > 0 ? (\n <div className={\"cube-sheet-card\"}>\n {accountMenuItems.map((item, index) => (\n <Fragment key={item.key}>\n <Cell\n title={\n <>\n {item.icon} &nbsp;{item.label}\n </>\n }\n onClick={() => {\n item.onClick?.();\n close();\n }}\n />\n {index !== accountMenuItems.length - 1 ? <div className={\"cube-sheet-split-line\"} /> : null}\n </Fragment>\n ))}\n </div>\n ) : null}\n\n {onLogoutBtnClick ? (\n <div className={\"cube-sheet-card\"}>\n <Cell\n title=\"登出\"\n onClick={() => {\n onLogoutBtnClick();\n close();\n }}\n />\n </div>\n ) : null}\n </Flex>\n </Drawer>\n );\n};\n","import { type HTMLAttributes, useEffect, useState } from \"react\";\nimport { Flex } from \"antd\";\nimport \"./loading.css\";\n\nexport interface PageLoadingProps {\n tip?: string;\n}\n\nexport const PageLoading = ({ tip = \"加载中...\" }: PageLoadingProps) => (\n <Flex justify=\"center\" align=\"center\" className={\"cube-page-loading\"}>\n {tip}\n </Flex>\n);\n\nexport interface DelayedLoadingProps extends HTMLAttributes<HTMLDivElement> {\n tip?: string;\n delay?: number;\n}\n\nexport const DelayedLoading = ({\n tip = \"页面加载中...\",\n delay = 500,\n className,\n ...props\n}: DelayedLoadingProps) => {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const timer = window.setTimeout(() => setVisible(true), delay);\n return () => window.clearTimeout(timer);\n }, [delay]);\n\n if (!visible) return null;\n\n return (\n <div\n className={[\"cube-delayed-loading\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {tip}\n </div>\n );\n};\n","import type { PropsWithChildren, ReactNode } from \"react\";\nimport { Button, Input, type ButtonProps } from \"antd\";\nimport type { SearchProps } from \"antd/es/input\";\nimport { SearchOutlined } from \"@ant-design/icons\";\nimport { useCubeAppHeaderLeft } from \"../cube-app/cube-app\";\nimport { MobileOnly } from \"../responsive/responsive\";\nimport \"./page.css\";\n\nconst PageContainer = ({ children }: PropsWithChildren) => <div className={\"cube-page-container\"}>{children}</div>;\n\nconst PageContent = ({ children }: PropsWithChildren) => <div className={\"cube-page-content\"}>{children}</div>;\n\nconst PageActionBar = ({ children }: PropsWithChildren) => (\n <MobileOnly>\n <div className={\"cube-page-action-bar\"}>{children}</div>\n </MobileOnly>\n);\n\nexport const ActionIcon = ({ className, size = \"large\", ...props }: ButtonProps) => (\n <Button className={[\"cube-page-action-icon\", className].filter(Boolean).join(\" \")} size={size} {...props} />\n);\n\nexport const ActionButton = ({\n children,\n type = \"primary\",\n block = true,\n size = \"large\",\n ...props\n}: ButtonProps) => (\n <Button block={block} size={size} type={type} {...props}>\n {children}\n </Button>\n);\n\n/** Mobile action-bar search field (fills remaining width). */\nexport const ActionSearch = ({ className, ...props }: SearchProps) => (\n <Input.Search\n placeholder=\"输入关键字搜索\"\n enterButton={<SearchOutlined />}\n size=\"large\"\n autoFocus\n {...props}\n className={[\"cube-page-action-search\", className].filter(Boolean).join(\" \")}\n />\n);\n\nexport interface CubePageProps extends PropsWithChildren {\n desktopHeaderLeft?: ReactNode;\n mobileActionBar?: ReactNode;\n}\n\nexport const CubePage = ({ desktopHeaderLeft, mobileActionBar, children }: CubePageProps) => {\n useCubeAppHeaderLeft(desktopHeaderLeft);\n\n return (\n <PageContainer>\n <PageContent>{children}</PageContent>\n {mobileActionBar ? <PageActionBar>{mobileActionBar}</PageActionBar> : null}\n </PageContainer>\n );\n};\n","import type { ReactNode } from \"react\";\nimport { Flex } from \"antd\";\nimport \"./empty-tip.css\";\n\nexport interface EmptyTipProps {\n className?: string;\n title?: ReactNode;\n subTitle?: ReactNode;\n extra?: ReactNode;\n}\n\nexport const EmptyTip = ({ title, subTitle, extra, className }: EmptyTipProps) => (\n <Flex\n vertical\n gap={4}\n align=\"center\"\n justify=\"center\"\n className={[\"cube-empty-tip\", className].filter(Boolean).join(\" \")}\n >\n {title ? <div className=\"cube-empty-tip-title\">{title}</div> : null}\n {subTitle ? <div className=\"cube-empty-tip-subtitle\">{subTitle}</div> : null}\n {extra ? <div>{extra}</div> : null}\n </Flex>\n);\n","import { Flex, type FlexProps } from \"antd\";\nimport \"./color-list.css\";\n\nexport const MARK_COLORS_MAP: Record<string, string> = {\n c1: \"#ef4444\",\n c2: \"#f97316\",\n c3: \"#f59e0b\",\n c4: \"#eab308\",\n c5: \"#84cc16\",\n c6: \"#22c55e\",\n c7: \"#10b981\",\n c8: \"#14b8a6\",\n c9: \"#06b6d4\",\n c10: \"#0ea5e9\",\n c11: \"#3b82f6\",\n c12: \"#6366f1\",\n c13: \"#8b5cf6\",\n c14: \"#a855f7\",\n c15: \"#d946ef\",\n c16: \"#ec4899\",\n};\n\nexport const MARK_COLORS = [\n \"c1\",\n \"c2\",\n \"c3\",\n \"c4\",\n \"c5\",\n \"c6\",\n \"c7\",\n \"c8\",\n \"c9\",\n \"c10\",\n \"c11\",\n \"c12\",\n \"c13\",\n \"c14\",\n \"c15\",\n \"c16\",\n] as const;\n\nexport const MARK_COLORS_WITH_EMPTY = [...MARK_COLORS, \"\"] as const;\n\nexport const getColorValue = (colorCode: string): string | undefined => MARK_COLORS_MAP[colorCode];\n\ninterface ColorItemProps {\n colorCode: string;\n selected: boolean;\n onClick(colorCode: string): void;\n}\n\nconst ColorItem = ({ colorCode, selected, onClick }: ColorItemProps) => {\n const classes = [\"cube-color-dot\"];\n if (selected) classes.push(\"cube-color-dot-selected\");\n if (colorCode === \"\") classes.push(\"cube-color-dot-clear\");\n\n return (\n <button\n type=\"button\"\n aria-label={colorCode === \"\" ? \"清除颜色\" : `颜色 ${colorCode}`}\n className={classes.join(\" \")}\n style={{ backgroundColor: MARK_COLORS_MAP[colorCode] }}\n onClick={() => onClick(colorCode)}\n />\n );\n};\n\nexport interface ColorListProps {\n value?: string;\n onChange?(value: string): void;\n flexProps?: Omit<FlexProps, \"children\">;\n}\n\n/** Single-select color dots (includes a clear/empty option), matching Cube search filters. */\nexport const ColorList = ({ value, onChange, flexProps }: ColorListProps) => (\n <Flex wrap gap={8} {...flexProps}>\n {MARK_COLORS_WITH_EMPTY.map((colorCode) => (\n <ColorItem\n key={colorCode || \"clear\"}\n colorCode={colorCode}\n selected={value === colorCode}\n onClick={(next) => onChange?.(next)}\n />\n ))}\n </Flex>\n);\n","import { type ReactNode, useState } from \"react\";\nimport { Button, Col, Drawer, Flex, Input, Row } from \"antd\";\nimport { FilterOutlined, LeftOutlined } from \"@ant-design/icons\";\nimport { ActionIcon, ActionSearch, CubePage } from \"../page/page\";\nimport { DesktopOnly, MobileOnly } from \"../responsive/responsive\";\nimport { EmptyTip } from \"../empty-tip/empty-tip\";\nimport \"./search-page.css\";\n\nexport interface CubeSearchPageProps {\n /** Last committed keyword; used as the search inputs' default value. */\n keyword?: string;\n placeholder?: string;\n searchButtonLabel?: string;\n onSearch(value: string): void;\n onBack(): void;\n desktopHeaderLeft?: ReactNode;\n /** Filter UI (colors, tags, …). Desktop: in the page body. Mobile: in a bottom drawer. */\n filters?: ReactNode;\n mobileFilterTitle?: string;\n mobileFilterIcon?: ReactNode;\n /** True before the first search (no keyword / filters committed). */\n pending?: boolean;\n loading?: boolean;\n /** True after a search that returned no rows. Ignored while pending or loading. */\n empty?: boolean;\n pendingHint?: ReactNode;\n loadingTitle?: ReactNode;\n loadingHint?: ReactNode;\n emptyTitle?: ReactNode;\n emptyHint?: ReactNode;\n children?: ReactNode;\n}\n\nexport const CubeSearchPage = ({\n keyword = \"\",\n placeholder = \"请输入关键字,回车搜索\",\n searchButtonLabel = \"搜索\",\n onSearch,\n onBack,\n desktopHeaderLeft,\n filters,\n mobileFilterTitle = \"筛选\",\n mobileFilterIcon,\n pending = false,\n loading = false,\n empty = false,\n pendingHint = \"可使用关键词和颜色进行搜索\",\n loadingTitle = \"正在搜索中...\",\n loadingHint = \"请稍候\",\n emptyTitle = \"没有找到相关结果\",\n emptyHint = \"请尝试其他关键字\",\n children,\n}: CubeSearchPageProps) => {\n const [filterOpen, setFilterOpen] = useState(false);\n const hasFilters = filters != null;\n\n const renderBody = () => {\n if (loading) {\n return <EmptyTip title={loadingTitle} subTitle={loadingHint} />;\n }\n if (pending) {\n return <EmptyTip subTitle={pendingHint} />;\n }\n if (empty) {\n return (\n <div data-testid=\"search-empty-tip\">\n <EmptyTip title={emptyTitle} subTitle={emptyHint} />\n </div>\n );\n }\n\n return (\n <Flex\n vertical\n align=\"center\"\n gap={8}\n className=\"cube-search-page-results\"\n data-testid=\"search-result-list\"\n >\n {children}\n </Flex>\n );\n };\n\n return (\n <>\n <CubePage\n desktopHeaderLeft={desktopHeaderLeft}\n mobileActionBar={\n <>\n <ActionIcon icon={<LeftOutlined />} aria-label=\"返回\" onClick={onBack} />\n {hasFilters ? (\n <ActionIcon\n icon={mobileFilterIcon ?? <FilterOutlined />}\n aria-label=\"打开筛选\"\n onClick={() => setFilterOpen(true)}\n />\n ) : null}\n <ActionSearch defaultValue={keyword} onSearch={onSearch} />\n </>\n }\n >\n <Flex vertical gap={16} align=\"center\" className=\"cube-search-page\">\n <DesktopOnly>\n <Input.Search\n placeholder={placeholder}\n enterButton={searchButtonLabel}\n autoFocus\n size=\"large\"\n defaultValue={keyword}\n onSearch={onSearch}\n className=\"cube-search-page-input\"\n data-testid=\"search-keyword-input\"\n />\n </DesktopOnly>\n {hasFilters ? <DesktopOnly>{filters}</DesktopOnly> : null}\n {renderBody()}\n </Flex>\n </CubePage>\n\n {hasFilters ? (\n <MobileOnly>\n <Drawer\n title={mobileFilterTitle}\n open={filterOpen}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom\"\n closable={false}\n styles={{\n footer: { padding: 8, border: \"none\" },\n header: { textAlign: \"center\", padding: 8 },\n }}\n footer={\n <Row gutter={8}>\n <Col flex=\"1\">\n <Button block size=\"large\" onClick={() => setFilterOpen(false)}>\n 确定\n </Button>\n </Col>\n </Row>\n }\n >\n <Flex vertical gap={16} className=\"cube-search-page-drawer\" align=\"center\">\n {filters}\n </Flex>\n </Drawer>\n </MobileOnly>\n ) : null}\n </>\n );\n};\n"],"mappings":"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","names":["useMemo","useMemo","useCallback","useMemo","useState","Button","jsx","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","useCallback","useMemo","Button","Fragment","Button","Flex","Statistic","Fragment","jsx","jsxs","Button","Flex","Statistic","useEffect","useState","Flex","jsx","Flex","useState","useEffect","Button","SearchOutlined","jsx","jsxs","Button","SearchOutlined","Flex","jsx","jsxs","Flex","Flex","jsx","Flex","useState","Button","Drawer","Flex","Input","Fragment","jsx","jsxs","useState","Flex","Input","Drawer","Button"]}
1
+ {"version":3,"sources":["../src/responsive/responsive.tsx","../src/cube-config-provider/cube-config-provider.tsx","../src/cube-app/cube-app.tsx","../src/app-header/app-header.tsx","../src/account-menu/account-menu-button.tsx","../src/account-menu/account-menu.tsx","../src/about-dialog/about-dialog.tsx","../src/mobile-account-sheet/mobile-account-sheet.tsx","../src/loading/loading.tsx","../src/page/page.tsx","../src/empty-tip/empty-tip.tsx","../src/color-list/color-list.tsx","../src/color-picker/color-picker.tsx","../src/search-page/search-page.tsx","../src/login-page/login-page.tsx"],"sourcesContent":["import { type PropsWithChildren, type ReactNode, useCallback, useMemo, useSyncExternalStore } from \"react\";\n\nexport const DEFAULT_MOBILE_BREAKPOINT = 767;\n\nexport interface UseMediaQueryOptions {\n defaultMatches?: boolean;\n}\n\nexport interface ResponsiveProps extends PropsWithChildren {\n defaultMatches?: boolean;\n}\n\nexport const useMediaQuery = (query: string, options: UseMediaQueryOptions = {}): boolean => {\n const { defaultMatches = false } = options;\n const mediaQueryList = useMemo(\n () =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(query)\n : null,\n [query],\n );\n\n const subscribe = useCallback(\n (notify: () => void) => {\n if (!mediaQueryList) return () => undefined;\n mediaQueryList.addEventListener(\"change\", notify);\n return () => mediaQueryList.removeEventListener(\"change\", notify);\n },\n [mediaQueryList],\n );\n\n const getSnapshot = useCallback(\n () => mediaQueryList?.matches ?? defaultMatches,\n [defaultMatches, mediaQueryList],\n );\n const getServerSnapshot = useCallback(() => defaultMatches, [defaultMatches]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n};\n\nexport const useIsMobile = ({ defaultMatches }: UseMediaQueryOptions = {}): boolean =>\n useMediaQuery(`(max-width: ${DEFAULT_MOBILE_BREAKPOINT}px)`, { defaultMatches });\n\nexport const MobileOnly = ({ children, defaultMatches }: ResponsiveProps): ReactNode => {\n const isMobile = useIsMobile({ defaultMatches });\n return isMobile ? children : null;\n};\n\nexport const DesktopOnly = ({ children, defaultMatches }: ResponsiveProps): ReactNode => {\n const isMobile = useIsMobile({ defaultMatches });\n return isMobile ? null : children;\n};\n","import { useMemo, type ReactNode } from \"react\";\nimport { ConfigProvider } from \"antd\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { useIsMobile } from \"../responsive/responsive\";\n\nexport interface CubeConfigProviderProps {\n children: ReactNode;\n\n primaryColor?: string;\n}\n\nconst DEFAULT_PRIMARY_COLOR = \"#ec008c\";\n\n/**\n * Applies the fixed Cube antd configuration (`zh_CN` locale, `primaryColor` token, a larger\n * base font size on mobile) without rendering any application shell. Mount it on its own for\n * pages that should share the Cube theme but live outside `CubeApp` — `CubeApp` itself wraps\n * this component internally.\n */\nexport const CubeConfigProvider = ({ children, primaryColor }: CubeConfigProviderProps) => {\n const isMobile = useIsMobile();\n\n const theme = useMemo(\n () => ({\n token: {\n colorPrimary: primaryColor ?? DEFAULT_PRIMARY_COLOR,\n lineWidth: 2,\n controlOutlineWidth: 1,\n ...(isMobile ? { fontSize: 16 } : {}),\n },\n components: {\n Card: {\n colorBorderSecondary: \"var(--cube-border-color, #d1d5db)\",\n lineHeight: 1.6,\n },\n },\n }),\n [primaryColor, isMobile],\n );\n\n return (\n <ConfigProvider locale={zhCN} theme={theme}>\n {children}\n </ConfigProvider>\n );\n};\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { Button } from \"antd\";\nimport { SearchOutlined, SmileOutlined } from \"@ant-design/icons\";\nimport { useIsMobile } from \"../responsive/responsive\";\nimport { CubeConfigProvider } from \"../cube-config-provider/cube-config-provider\";\nimport { AppHeader } from \"../app-header/app-header\";\nimport { AccountMenuButton } from \"../account-menu/account-menu-button\";\nimport { AccountMenu, type AccountMenuItem, type AccountMenuStat } from \"../account-menu/account-menu\";\nimport {\n AboutDialog,\n type AboutAppInfo,\n type AboutAuthorInfo,\n type AboutItem,\n} from \"../about-dialog/about-dialog\";\nimport \"./cube-app.css\";\n\nexport interface CubeAppAboutInfo extends AboutAppInfo {\n contactEmail?: string;\n author?: AboutAuthorInfo;\n items?: AboutItem[];\n}\n\nexport interface CubeAppContextValue {\n accountMenuStats?: AccountMenuStat[];\n accountMenuItems?: AccountMenuItem[];\n onLogoutBtnClick?(): void;\n userName?: ReactNode;\n openAbout(): void;\n setHeaderLeft(node: ReactNode): void;\n}\n\nconst CubeAppContext = createContext<CubeAppContextValue>({\n openAbout: () => undefined,\n setHeaderLeft: () => undefined,\n});\n\n/**\n * Reads the account/about configuration passed to `CubeApp`. Only needed by components\n * mounted elsewhere in the route tree (e.g. `MobileAccountSheet`) — `CubeApp` itself\n * already has this data as props.\n */\nexport const useCubeAppContext = (): CubeAppContextValue => useContext(CubeAppContext);\n\n/**\n * Lets the currently mounted page override `CubeApp`'s `headerLeft` slot. Resets to the\n * default `headerLeft` prop when the calling component unmounts.\n */\nexport const useCubeAppHeaderLeft = (node: ReactNode): void => {\n const { setHeaderLeft } = useCubeAppContext();\n\n useEffect(() => {\n setHeaderLeft(node);\n return () => setHeaderLeft(undefined);\n }, [node, setHeaderLeft]);\n};\n\nexport interface CubeAppProps {\n children: ReactNode;\n\n primaryColor?: string;\n\n accountMenuStats?: AccountMenuStat[];\n accountMenuItems?: AccountMenuItem[];\n onLogoutBtnClick?(): void;\n userName?: ReactNode;\n about: CubeAppAboutInfo;\n\n sidebarTop?: ReactNode;\n sidebarList?: ReactNode;\n sidebarBottom?: ReactNode;\n\n headerLeft?: ReactNode;\n headerRight?: ReactNode;\n headerSearchBtnLabel?: string;\n onHeaderSearchBtnClick?(): void;\n}\n\nconst SIDEBAR_WIDTH = \"var(--cube-sidebar-width, 15rem)\";\n\nexport const CubeApp = ({\n children,\n primaryColor,\n accountMenuStats,\n accountMenuItems,\n onLogoutBtnClick,\n userName,\n about,\n sidebarTop,\n sidebarList,\n sidebarBottom,\n headerLeft,\n headerRight,\n headerSearchBtnLabel,\n onHeaderSearchBtnClick,\n}: CubeAppProps) => {\n const isMobile = useIsMobile();\n const [collapsed, setCollapsed] = useState(false);\n const toggleSidebar = useCallback(() => setCollapsed((value) => !value), []);\n const [aboutOpen, setAboutOpen] = useState(false);\n const [headerLeftOverride, setHeaderLeftOverride] = useState<ReactNode>(undefined);\n\n const itemsWithAbout = useMemo<AccountMenuItem[]>(\n () => [\n ...(accountMenuItems ?? []),\n {\n key: \"cube-app-about\",\n label: \"关于\",\n icon: <SmileOutlined />,\n onClick: () => setAboutOpen(true),\n },\n ],\n [accountMenuItems],\n );\n\n const contextValue = useMemo<CubeAppContextValue>(\n () => ({\n accountMenuStats,\n accountMenuItems: itemsWithAbout,\n onLogoutBtnClick,\n userName,\n openAbout: () => setAboutOpen(true),\n setHeaderLeft: setHeaderLeftOverride,\n }),\n [accountMenuStats, itemsWithAbout, onLogoutBtnClick, userName],\n );\n\n const renderAccountMenuButton = () => (\n <AccountMenuButton\n content={({ close }) => (\n <AccountMenu\n stats={accountMenuStats}\n items={itemsWithAbout.map((item) => ({\n ...item,\n onClick: () => {\n item.onClick?.();\n close();\n },\n }))}\n footer={\n onLogoutBtnClick ? (\n <Button\n block\n danger\n aria-label=\"登出\"\n onClick={() => {\n onLogoutBtnClick();\n close();\n }}\n >\n 登出\n </Button>\n ) : undefined\n }\n />\n )}\n />\n );\n\n const renderShell = () => {\n if (isMobile) {\n return (\n <div className={\"cube-app-mobile-root\"} data-testid=\"cube-app-shell-mobile\">\n <main className={\"cube-app-mobile-content\"}>{children}</main>\n </div>\n );\n }\n\n const sidebarStyle: CSSProperties = {\n width: collapsed ? \"0px\" : SIDEBAR_WIDTH,\n };\n const contentStyle: CSSProperties = {\n width: collapsed ? \"100vw\" : `calc(100vw - ${SIDEBAR_WIDTH})`,\n };\n\n return (\n <div className={\"cube-app-root\"} data-testid=\"cube-app-shell\">\n <aside\n className={\"cube-app-sidebar\"}\n style={sidebarStyle}\n data-testid=\"cube-app-shell-sidebar\"\n aria-hidden={collapsed}\n >\n {sidebarTop ? <div className={\"cube-app-sidebar-top\"}>{sidebarTop}</div> : null}\n <div className={\"cube-app-sidebar-list\"}>{sidebarList}</div>\n {sidebarBottom ? <div className={\"cube-app-sidebar-bottom\"}>{sidebarBottom}</div> : null}\n </aside>\n <div className={\"cube-app-desktop-area\"} style={contentStyle}>\n <AppHeader\n title={headerLeftOverride ?? headerLeft}\n collapsed={collapsed}\n onToggleSidebar={toggleSidebar}\n actions={\n <>\n {headerRight}\n {onHeaderSearchBtnClick ? (\n <Button\n className={\"cube-app-search-button\"}\n icon={<SearchOutlined aria-hidden />}\n aria-label={headerSearchBtnLabel ?? \"\\u641c\\u7d22\"}\n onClick={onHeaderSearchBtnClick}\n >\n {headerSearchBtnLabel ?? \"\\u641c\\u7d22\"}\n </Button>\n ) : null}\n {renderAccountMenuButton()}\n </>\n }\n />\n <main className={\"cube-app-content\"}>{children}</main>\n </div>\n </div>\n );\n };\n\n return (\n <CubeConfigProvider primaryColor={primaryColor}>\n <CubeAppContext.Provider value={contextValue}>\n {renderShell()}\n <AboutDialog\n open={aboutOpen}\n onClose={() => setAboutOpen(false)}\n app={about}\n contactEmail={about.contactEmail}\n author={about.author}\n items={about.items}\n />\n </CubeAppContext.Provider>\n </CubeConfigProvider>\n );\n};\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { MenuFoldOutlined, MenuUnfoldOutlined } from \"@ant-design/icons\";\nimport \"./app-header.css\";\n\nexport interface AppHeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: ReactNode;\n actions?: ReactNode;\n collapsed?: boolean;\n showSidebarToggle?: boolean;\n onToggleSidebar?(): void;\n}\n\nexport const AppHeader = ({\n title,\n actions,\n collapsed = false,\n onToggleSidebar,\n showSidebarToggle = onToggleSidebar !== undefined,\n className,\n ...headerProps\n}: AppHeaderProps) => {\n const label = collapsed ? \"展开侧边栏\" : \"收起侧边栏\";\n const ToggleIcon = collapsed ? MenuUnfoldOutlined : MenuFoldOutlined;\n\n return (\n <header className={[\"cube-app-header\", className].filter(Boolean).join(\" \")} {...headerProps}>\n <div className={\"cube-app-header-leading\"}>\n {showSidebarToggle ? (\n <button\n type=\"button\"\n className={\"cube-app-header-toggle\"}\n aria-label={label}\n aria-expanded={!collapsed}\n onClick={onToggleSidebar}\n >\n <ToggleIcon aria-hidden />\n </button>\n ) : null}\n <div className={\"cube-app-header-title\"}>{title}</div>\n </div>\n {actions ? <div className={\"cube-app-header-actions\"}>{actions}</div> : null}\n </header>\n );\n};\n","import { type ReactNode, useState } from \"react\";\nimport { UserOutlined } from \"@ant-design/icons\";\nimport { Popover } from \"antd\";\nimport \"./account-menu.css\";\n\nexport interface AccountMenuRenderContext {\n close(): void;\n}\n\nexport interface AccountMenuButtonProps {\n content: ReactNode | ((context: AccountMenuRenderContext) => ReactNode);\n}\n\nexport const AccountMenuButton = ({ content }: AccountMenuButtonProps) => {\n const [open, setOpen] = useState(false);\n const close = () => setOpen(false);\n const renderedContent = typeof content === \"function\" ? content({ close }) : content;\n\n return (\n <Popover\n placement=\"bottomRight\"\n trigger=\"click\"\n content={renderedContent}\n open={open}\n onOpenChange={setOpen}\n arrow\n >\n <button\n type=\"button\"\n className={\"cube-account-trigger\"}\n aria-label=\"打开用户菜单\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n >\n <UserOutlined aria-hidden />\n </button>\n </Popover>\n );\n};\n","import type { Key, ReactNode } from \"react\";\nimport { Button, Statistic } from \"antd\";\nimport \"./account-menu.css\";\n\nexport interface AccountMenuStat {\n key: Key;\n title: ReactNode;\n value: string | number;\n icon?: ReactNode;\n}\n\nexport interface AccountMenuItem {\n key: Key;\n label: ReactNode;\n icon?: ReactNode;\n danger?: boolean;\n disabled?: boolean;\n onClick?(): void;\n}\n\nexport interface AccountMenuProps {\n stats?: AccountMenuStat[];\n items?: AccountMenuItem[];\n footer?: ReactNode;\n}\n\nexport const AccountMenu = ({ stats = [], items = [], footer }: AccountMenuProps) => (\n <div className={\"cube-account-menu\"}>\n {stats.length > 0 ? (\n <div className={\"cube-account-menu-stats\"}>\n {stats.map((stat) => (\n <Statistic key={stat.key} title={stat.title} value={stat.value} prefix={stat.icon} />\n ))}\n </div>\n ) : null}\n {items.length > 0 ? (\n <div className={\"cube-account-menu-items\"}>\n {items.map((item) => (\n <Button\n key={item.key}\n block\n icon={item.icon}\n danger={item.danger}\n disabled={item.disabled}\n aria-label={typeof item.label === \"string\" ? item.label : undefined}\n onClick={item.onClick}\n >\n {item.label}\n </Button>\n ))}\n </div>\n ) : null}\n {footer ? <div className={\"cube-account-menu-footer\"}>{footer}</div> : null}\n </div>\n);\n","import type { Key, ReactNode } from \"react\";\nimport { BarcodeOutlined, GithubOutlined, SendOutlined } from \"@ant-design/icons\";\nimport { Flex, Modal } from \"antd\";\nimport \"./about-dialog.css\";\n\nexport interface AboutAppInfo {\n name: string;\n version?: string;\n repository?: string;\n description?: ReactNode;\n}\n\nexport interface AboutAuthorInfo {\n name: string;\n url?: string;\n}\n\nexport interface AboutItem {\n key: Key;\n icon?: ReactNode;\n label: ReactNode;\n value: ReactNode;\n href?: string;\n}\n\nexport interface AboutDialogProps {\n open: boolean;\n onClose(): void;\n app: AboutAppInfo;\n contactEmail?: string;\n author?: AboutAuthorInfo;\n items?: AboutItem[];\n}\n\nconst renderItem = (item: AboutItem) => {\n const content = (\n <div className={\"cube-about-item\"}>\n <Flex justify=\"space-between\" gap={16}>\n <div className={\"cube-about-item-label\"}>\n {item.icon ? <>{item.icon} &nbsp;</> : null}\n {item.label}\n </div>\n <div className={\"cube-about-item-value\"}>{item.value}</div>\n </Flex>\n </div>\n );\n\n return item.href ? (\n <a key={item.key} href={item.href} className={\"cube-about-link\"}>\n {content}\n </a>\n ) : (\n <div key={item.key}>{content}</div>\n );\n};\n\nexport const AboutDialog = ({\n open,\n onClose,\n app,\n contactEmail,\n author,\n items = [],\n}: AboutDialogProps) => {\n const defaultItems: AboutItem[] = [];\n\n if (contactEmail) {\n defaultItems.push({\n key: \"contact\",\n icon: <SendOutlined />,\n label: \"联系我\",\n value: contactEmail,\n href: `mailto:${contactEmail}?&subject=${encodeURIComponent(\n `${app.name} 相关`,\n )}`,\n });\n }\n\n if (app.version) {\n defaultItems.push({\n key: \"version\",\n icon: <BarcodeOutlined />,\n label: \"当前版本\",\n value: app.version,\n });\n }\n\n if (app.repository) {\n defaultItems.push({\n key: \"repository\",\n icon: <GithubOutlined />,\n label: \"开源地址\",\n value: \"github\",\n href: app.repository,\n });\n }\n\n const renderedItems = [...defaultItems, ...items];\n\n return (\n <Modal\n open={open}\n onCancel={onClose}\n onOk={onClose}\n title={`关于应用 ${app.name}`}\n footer={(_, { OkBtn }) => (\n <Flex\n align=\"center\"\n justify={author ? \"space-between\" : \"flex-end\"}\n gap={16}\n >\n {author ? (\n <div className={\"cube-about-powered-by\"}>\n Powered by 💗{\" \"}\n {author.url ? (\n <a href={author.url}>{author.name}</a>\n ) : (\n author.name\n )}\n </div>\n ) : null}\n <OkBtn />\n </Flex>\n )}\n >\n <Flex gap={16} vertical className={\"cube-about-body\"}>\n {app.description ? (\n <div className={\"cube-about-description\"}>{app.description}</div>\n ) : null}\n {renderedItems.map(renderItem)}\n </Flex>\n </Modal>\n );\n};\n","import { Fragment, type ReactNode } from \"react\";\nimport { Button, Drawer, Flex, Statistic } from \"antd\";\nimport { RightOutlined } from \"@ant-design/icons\";\nimport { useCubeAppContext } from \"../cube-app/cube-app\";\nimport \"./mobile-account-sheet.css\";\n\nexport interface MobileAccountSheetProps {\n visible: boolean;\n onVisibleChange(visible: boolean): void;\n}\n\ninterface CellProps {\n title: ReactNode;\n extra?: ReactNode;\n onClick?(): void;\n}\n\nconst Cell = ({ title, extra, onClick }: CellProps) =>\n onClick ? (\n <button type=\"button\" className={\"cube-sheet-cell\"} onClick={onClick}>\n <span>{title}</span>\n {extra ? <span>{extra}</span> : null}\n </button>\n ) : (\n <div className={\"cube-sheet-cell\"}>\n <span>{title}</span>\n {extra ? <span>{extra}</span> : null}\n </div>\n );\n\nexport const MobileAccountSheet = ({ visible, onVisibleChange }: MobileAccountSheetProps) => {\n const { accountMenuStats, accountMenuItems, onLogoutBtnClick, userName } = useCubeAppContext();\n const close = () => onVisibleChange(false);\n\n return (\n <Drawer\n open={visible}\n onClose={close}\n placement=\"left\"\n width=\"100%\"\n closable={false}\n styles={{\n header: { display: \"none\" },\n body: { padding: 12 },\n footer: { padding: 8, borderTop: \"none\" },\n }}\n footer={\n <Button block size=\"large\" type=\"primary\" aria-label=\"返回\" onClick={close}>\n 返回\n </Button>\n }\n >\n <Flex vertical gap={12}>\n {accountMenuStats && accountMenuStats.length > 0 ? (\n <div className={\"cube-sheet-card\"}>\n <Flex justify=\"space-around\">\n {accountMenuStats.map((stat) => (\n <Statistic key={stat.key} title={stat.title} value={stat.value} prefix={stat.icon} />\n ))}\n </Flex>\n </div>\n ) : null}\n\n {userName ? (\n <div className={\"cube-sheet-card\"}>\n <Cell title=\"登录用户\" extra={userName} />\n </div>\n ) : null}\n\n {accountMenuItems && accountMenuItems.length > 0 ? (\n <div className={\"cube-sheet-card\"}>\n {accountMenuItems.map((item, index) => (\n <Fragment key={item.key}>\n <Cell\n title={\n <>\n {item.icon} &nbsp;{item.label}\n </>\n }\n extra={<RightOutlined className=\"text-gray-400\" />}\n onClick={() => {\n item.onClick?.();\n close();\n }}\n />\n {index !== accountMenuItems.length - 1 ? <div className={\"cube-sheet-split-line\"} /> : null}\n </Fragment>\n ))}\n </div>\n ) : null}\n\n {onLogoutBtnClick ? (\n <div className={\"cube-sheet-card\"}>\n <Cell\n title=\"登出\"\n extra={<RightOutlined className=\"text-gray-400\" />}\n onClick={() => {\n onLogoutBtnClick();\n close();\n }}\n />\n </div>\n ) : null}\n </Flex>\n </Drawer>\n );\n};\n","import { type HTMLAttributes, useEffect, useState } from \"react\";\nimport { Flex } from \"antd\";\nimport \"./loading.css\";\n\nexport interface PageLoadingProps {\n tip?: string;\n}\n\nexport const PageLoading = ({ tip = \"加载中...\" }: PageLoadingProps) => (\n <Flex justify=\"center\" align=\"center\" className={\"cube-page-loading\"}>\n {tip}\n </Flex>\n);\n\nexport interface DelayedLoadingProps extends HTMLAttributes<HTMLDivElement> {\n tip?: string;\n delay?: number;\n}\n\nexport const DelayedLoading = ({\n tip = \"页面加载中...\",\n delay = 500,\n className,\n ...props\n}: DelayedLoadingProps) => {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const timer = window.setTimeout(() => setVisible(true), delay);\n return () => window.clearTimeout(timer);\n }, [delay]);\n\n if (!visible) return null;\n\n return (\n <div\n className={[\"cube-delayed-loading\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {tip}\n </div>\n );\n};\n","import type { PropsWithChildren, ReactNode } from \"react\";\nimport { Button, Input, type ButtonProps } from \"antd\";\nimport type { SearchProps } from \"antd/es/input\";\nimport { SearchOutlined } from \"@ant-design/icons\";\nimport { useCubeAppHeaderLeft } from \"../cube-app/cube-app\";\nimport { MobileOnly } from \"../responsive/responsive\";\nimport \"./page.css\";\n\nconst PageContainer = ({ children }: PropsWithChildren) => <div className={\"cube-page-container\"}>{children}</div>;\n\nconst PageContent = ({ children }: PropsWithChildren) => <div className={\"cube-page-content\"}>{children}</div>;\n\nconst PageActionBar = ({ children }: PropsWithChildren) => (\n <MobileOnly>\n <div className={\"cube-page-action-bar\"}>{children}</div>\n </MobileOnly>\n);\n\nexport const ActionIcon = ({ className, size = \"large\", ...props }: ButtonProps) => (\n <Button className={[\"cube-page-action-icon\", className].filter(Boolean).join(\" \")} size={size} {...props} />\n);\n\nexport const ActionButton = ({\n children,\n type = \"primary\",\n block = true,\n size = \"large\",\n ...props\n}: ButtonProps) => (\n <Button block={block} size={size} type={type} {...props}>\n {children}\n </Button>\n);\n\n/** Mobile action-bar search field (fills remaining width). */\nexport const ActionSearch = ({ className, ...props }: SearchProps) => (\n <Input.Search\n placeholder=\"输入关键字搜索\"\n enterButton={<SearchOutlined />}\n size=\"large\"\n autoFocus\n {...props}\n className={[\"cube-page-action-search\", className].filter(Boolean).join(\" \")}\n />\n);\n\nexport interface CubePageProps extends PropsWithChildren {\n desktopHeaderLeft?: ReactNode;\n mobileActionBar?: ReactNode;\n}\n\nexport const CubePage = ({ desktopHeaderLeft, mobileActionBar, children }: CubePageProps) => {\n useCubeAppHeaderLeft(desktopHeaderLeft);\n\n return (\n <PageContainer>\n <PageContent>{children}</PageContent>\n {mobileActionBar ? <PageActionBar>{mobileActionBar}</PageActionBar> : null}\n </PageContainer>\n );\n};\n","import type { ReactNode } from \"react\";\nimport { Flex } from \"antd\";\nimport \"./empty-tip.css\";\n\nexport interface EmptyTipProps {\n className?: string;\n title?: ReactNode;\n subTitle?: ReactNode;\n extra?: ReactNode;\n}\n\nexport const EmptyTip = ({ title, subTitle, extra, className }: EmptyTipProps) => (\n <Flex\n vertical\n gap={4}\n align=\"center\"\n justify=\"center\"\n className={[\"cube-empty-tip\", className].filter(Boolean).join(\" \")}\n >\n {title ? <div className=\"cube-empty-tip-title\">{title}</div> : null}\n {subTitle ? <div className=\"cube-empty-tip-subtitle\">{subTitle}</div> : null}\n {extra ? <div>{extra}</div> : null}\n </Flex>\n);\n","import { Flex, type FlexProps } from \"antd\";\nimport \"./color-list.css\";\n\nexport const MARK_COLORS_MAP: Record<string, string> = {\n c1: \"#ef4444\",\n c2: \"#f97316\",\n c3: \"#f59e0b\",\n c4: \"#eab308\",\n c5: \"#84cc16\",\n c6: \"#22c55e\",\n c7: \"#10b981\",\n c8: \"#14b8a6\",\n c9: \"#06b6d4\",\n c10: \"#0ea5e9\",\n c11: \"#3b82f6\",\n c12: \"#6366f1\",\n c13: \"#8b5cf6\",\n c14: \"#a855f7\",\n c15: \"#d946ef\",\n c16: \"#ec4899\",\n};\n\nexport const MARK_COLORS = [\n \"c1\",\n \"c2\",\n \"c3\",\n \"c4\",\n \"c5\",\n \"c6\",\n \"c7\",\n \"c8\",\n \"c9\",\n \"c10\",\n \"c11\",\n \"c12\",\n \"c13\",\n \"c14\",\n \"c15\",\n \"c16\",\n] as const;\n\nexport const MARK_COLORS_WITH_EMPTY = [...MARK_COLORS, \"\"] as const;\n\nexport const getColorValue = (colorCode: string): string | undefined => MARK_COLORS_MAP[colorCode];\n\ninterface ColorItemProps {\n colorCode: string;\n selected: boolean;\n onClick(colorCode: string): void;\n}\n\nconst ColorItem = ({ colorCode, selected, onClick }: ColorItemProps) => {\n const classes = [\"cube-color-dot\"];\n if (selected) classes.push(\"cube-color-dot-selected\");\n if (colorCode === \"\") classes.push(\"cube-color-dot-clear\");\n\n return (\n <button\n type=\"button\"\n aria-label={colorCode === \"\" ? \"清除颜色\" : `颜色 ${colorCode}`}\n className={classes.join(\" \")}\n style={{ backgroundColor: MARK_COLORS_MAP[colorCode] }}\n onClick={() => onClick(colorCode)}\n />\n );\n};\n\nexport interface ColorListProps {\n value?: string;\n onChange?(value: string): void;\n flexProps?: Omit<FlexProps, \"children\">;\n}\n\n/** Single-select color dots (includes a clear/empty option), matching Cube search filters. */\nexport const ColorList = ({ value, onChange, flexProps }: ColorListProps) => (\n <Flex wrap gap={8} {...flexProps}>\n {MARK_COLORS_WITH_EMPTY.map((colorCode) => (\n <ColorItem\n key={colorCode || \"clear\"}\n colorCode={colorCode}\n selected={value === colorCode}\n onClick={(next) => onChange?.(next)}\n />\n ))}\n </Flex>\n);\n","import { Modal } from \"antd\";\nimport { ColorList } from \"../color-list/color-list\";\n\nexport interface ColorPickerProps {\n value?: string;\n onChange?(value: string): void;\n open: boolean;\n onClose(): void;\n /** Close the modal after a color is chosen. Default true. */\n closeOnSelect?: boolean;\n}\n\n/** Modal wrapping ColorList. Used by certificate/tag/diary editors. */\nexport const ColorPicker = ({\n value,\n onChange,\n open,\n onClose,\n closeOnSelect = true,\n}: ColorPickerProps) => {\n const onSelect = (next: string) => {\n onChange?.(next);\n if (closeOnSelect) onClose();\n };\n\n return (\n <Modal\n open={open}\n onCancel={onClose}\n footer={null}\n closable={false}\n styles={{ body: { padding: 24 } }}\n >\n <div data-testid=\"color-picker\">\n <ColorList value={value} onChange={onSelect} flexProps={{ gap: 24, justify: \"center\" }} />\n </div>\n </Modal>\n );\n};\n","import { type ReactNode, useState } from \"react\";\nimport { Button, Col, Drawer, Flex, Input, Row } from \"antd\";\nimport { FilterOutlined, LeftOutlined } from \"@ant-design/icons\";\nimport { ActionIcon, ActionSearch, CubePage } from \"../page/page\";\nimport { DesktopOnly, MobileOnly } from \"../responsive/responsive\";\nimport { EmptyTip } from \"../empty-tip/empty-tip\";\nimport \"./search-page.css\";\n\nexport interface CubeSearchPageProps {\n /** Last committed keyword; used as the search inputs' default value. */\n keyword?: string;\n placeholder?: string;\n searchButtonLabel?: string;\n onSearch(value: string): void;\n onBack(): void;\n desktopHeaderLeft?: ReactNode;\n /** Filter UI (colors, tags, …). Desktop: in the page body. Mobile: in a bottom drawer. */\n filters?: ReactNode;\n mobileFilterTitle?: string;\n mobileFilterIcon?: ReactNode;\n /** True before the first search (no keyword / filters committed). */\n pending?: boolean;\n loading?: boolean;\n /** True after a search that returned no rows. Ignored while pending or loading. */\n empty?: boolean;\n pendingHint?: ReactNode;\n loadingTitle?: ReactNode;\n loadingHint?: ReactNode;\n emptyTitle?: ReactNode;\n emptyHint?: ReactNode;\n children?: ReactNode;\n}\n\nexport const CubeSearchPage = ({\n keyword = \"\",\n placeholder = \"请输入关键字,回车搜索\",\n searchButtonLabel = \"搜索\",\n onSearch,\n onBack,\n desktopHeaderLeft,\n filters,\n mobileFilterTitle = \"筛选\",\n mobileFilterIcon,\n pending = false,\n loading = false,\n empty = false,\n pendingHint = \"可使用关键词和颜色进行搜索\",\n loadingTitle = \"正在搜索中...\",\n loadingHint = \"请稍候\",\n emptyTitle = \"没有找到相关结果\",\n emptyHint = \"请尝试其他关键字\",\n children,\n}: CubeSearchPageProps) => {\n const [filterOpen, setFilterOpen] = useState(false);\n const hasFilters = filters != null;\n\n const renderBody = () => {\n if (loading) {\n return <EmptyTip title={loadingTitle} subTitle={loadingHint} />;\n }\n if (pending) {\n return <EmptyTip subTitle={pendingHint} />;\n }\n if (empty) {\n return (\n <div data-testid=\"search-empty-tip\">\n <EmptyTip title={emptyTitle} subTitle={emptyHint} />\n </div>\n );\n }\n\n return (\n <Flex\n vertical\n align=\"center\"\n gap={8}\n className=\"cube-search-page-results\"\n data-testid=\"search-result-list\"\n >\n {children}\n </Flex>\n );\n };\n\n return (\n <>\n <CubePage\n desktopHeaderLeft={desktopHeaderLeft}\n mobileActionBar={\n <>\n <ActionIcon icon={<LeftOutlined />} aria-label=\"返回\" onClick={onBack} />\n {hasFilters ? (\n <ActionIcon\n icon={mobileFilterIcon ?? <FilterOutlined />}\n aria-label=\"打开筛选\"\n onClick={() => setFilterOpen(true)}\n />\n ) : null}\n <ActionSearch defaultValue={keyword} onSearch={onSearch} />\n </>\n }\n >\n <Flex vertical gap={16} align=\"center\" className=\"cube-search-page\">\n <DesktopOnly>\n <Input.Search\n placeholder={placeholder}\n enterButton={searchButtonLabel}\n autoFocus\n size=\"large\"\n defaultValue={keyword}\n onSearch={onSearch}\n className=\"cube-search-page-input\"\n data-testid=\"search-keyword-input\"\n />\n </DesktopOnly>\n {hasFilters ? <DesktopOnly>{filters}</DesktopOnly> : null}\n {renderBody()}\n </Flex>\n </CubePage>\n\n {hasFilters ? (\n <MobileOnly>\n <Drawer\n title={mobileFilterTitle}\n open={filterOpen}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom\"\n closable={false}\n styles={{\n footer: { padding: 8, border: \"none\" },\n header: { textAlign: \"center\", padding: 8 },\n }}\n footer={\n <Row gutter={8}>\n <Col flex=\"1\">\n <Button block size=\"large\" onClick={() => setFilterOpen(false)}>\n 确定\n </Button>\n </Col>\n </Row>\n }\n >\n <Flex vertical gap={16} className=\"cube-search-page-drawer\" align=\"center\">\n {filters}\n </Flex>\n </Drawer>\n </MobileOnly>\n ) : null}\n </>\n );\n};\n","import type { ReactNode } from \"react\";\nimport \"./login-page.css\";\n\nexport interface CubeLoginPageProps {\n title: ReactNode;\n subtitle?: ReactNode;\n /** Content under the subtitle (login-failure alerts, …). */\n headerExtra?: ReactNode;\n children?: ReactNode;\n /** form = password field width; wide = device-gate / longer copy. */\n bodyWidth?: \"form\" | \"wide\";\n}\n\n/** Full-screen login/auth chrome: title, optional subtitle, centered body. */\nexport const CubeLoginPage = ({\n title,\n subtitle,\n headerExtra,\n children,\n bodyWidth = \"form\",\n}: CubeLoginPageProps) => {\n const bodyClass =\n bodyWidth === \"wide\"\n ? \"cube-login-page-body cube-login-page-body-wide\"\n : \"cube-login-page-body\";\n\n return (\n <div className=\"cube-login-page\" data-testid=\"cube-login-page\">\n <header className=\"cube-login-page-header\">\n <div className=\"cube-login-page-title\">{title}</div>\n {subtitle != null && subtitle !== \"\" ? (\n <div className=\"cube-login-page-subtitle\">{subtitle}</div>\n ) : null}\n {headerExtra != null ? (\n <div className=\"cube-login-page-header-extra\">{headerExtra}</div>\n ) : null}\n </header>\n {children != null ? <div className={bodyClass}>{children}</div> : null}\n </div>\n );\n};\n"],"mappings":";AAAA,SAAiD,aAAa,SAAS,4BAA4B;AAE5F,IAAM,4BAA4B;AAUlC,IAAM,gBAAgB,CAAC,OAAe,UAAgC,CAAC,MAAe;AAC3F,QAAM,EAAE,iBAAiB,MAAM,IAAI;AACnC,QAAM,iBAAiB;AAAA,IACrB,MACE,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,aAC1D,OAAO,WAAW,KAAK,IACvB;AAAA,IACN,CAAC,KAAK;AAAA,EACR;AAEA,QAAM,YAAY;AAAA,IAChB,CAAC,WAAuB;AACtB,UAAI,CAAC,eAAgB,QAAO,MAAM;AAClC,qBAAe,iBAAiB,UAAU,MAAM;AAChD,aAAO,MAAM,eAAe,oBAAoB,UAAU,MAAM;AAAA,IAClE;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,cAAc;AAAA,IAClB,MAAM,gBAAgB,WAAW;AAAA,IACjC,CAAC,gBAAgB,cAAc;AAAA,EACjC;AACA,QAAM,oBAAoB,YAAY,MAAM,gBAAgB,CAAC,cAAc,CAAC;AAE5E,SAAO,qBAAqB,WAAW,aAAa,iBAAiB;AACvE;AAEO,IAAM,cAAc,CAAC,EAAE,eAAe,IAA0B,CAAC,MACtE,cAAc,eAAe,yBAAyB,OAAO,EAAE,eAAe,CAAC;AAE1E,IAAM,aAAa,CAAC,EAAE,UAAU,eAAe,MAAkC;AACtF,QAAM,WAAW,YAAY,EAAE,eAAe,CAAC;AAC/C,SAAO,WAAW,WAAW;AAC/B;AAEO,IAAM,cAAc,CAAC,EAAE,UAAU,eAAe,MAAkC;AACvF,QAAM,WAAW,YAAY,EAAE,eAAe,CAAC;AAC/C,SAAO,WAAW,OAAO;AAC3B;;;ACnDA,SAAS,WAAAA,gBAA+B;AACxC,SAAS,sBAAsB;AAC/B,OAAO,UAAU;AAuCb;AA9BJ,IAAM,wBAAwB;AAQvB,IAAM,qBAAqB,CAAC,EAAE,UAAU,aAAa,MAA+B;AACzF,QAAM,WAAW,YAAY;AAE7B,QAAM,QAAQC;AAAA,IACZ,OAAO;AAAA,MACL,OAAO;AAAA,QACL,cAAc,gBAAgB;AAAA,QAC9B,WAAW;AAAA,QACX,qBAAqB;AAAA,QACrB,GAAI,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;AAAA,MACrC;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,sBAAsB;AAAA,UACtB,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,EACzB;AAEA,SACE,oBAAC,kBAAe,QAAQ,MAAM,OAC3B,UACH;AAEJ;;;AC7CA;AAAA,EACE;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,OAGK;AACP,SAAS,UAAAC,eAAc;AACvB,SAAS,gBAAgB,qBAAqB;;;ACV9C,SAAS,kBAAkB,0BAA0B;AAyB/C,SASM,OAAAC,MATN;AAdC,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,oBAAoB,oBAAoB;AAAA,EACxC;AAAA,EACA,GAAG;AACL,MAAsB;AACpB,QAAM,QAAQ,YAAY,mCAAU;AACpC,QAAM,aAAa,YAAY,qBAAqB;AAEpD,SACE,qBAAC,YAAO,WAAW,CAAC,mBAAmB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,aAC/E;AAAA,yBAAC,SAAI,WAAW,2BACb;AAAA,0BACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW;AAAA,UACX,cAAY;AAAA,UACZ,iBAAe,CAAC;AAAA,UAChB,SAAS;AAAA,UAET,0BAAAA,KAAC,cAAW,eAAW,MAAC;AAAA;AAAA,MAC1B,IACE;AAAA,MACJ,gBAAAA,KAAC,SAAI,WAAW,yBAA0B,iBAAM;AAAA,OAClD;AAAA,IACC,UAAU,gBAAAA,KAAC,SAAI,WAAW,2BAA4B,mBAAQ,IAAS;AAAA,KAC1E;AAEJ;;;AC3CA,SAAyB,gBAAgB;AACzC,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AAgChB,gBAAAC,YAAA;AArBD,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAA8B;AACxE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,QAAM,kBAAkB,OAAO,YAAY,aAAa,QAAQ,EAAE,MAAM,CAAC,IAAI;AAE7E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,cAAc;AAAA,MACd,OAAK;AAAA,MAEL,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW;AAAA,UACX,cAAW;AAAA,UACX,iBAAe;AAAA,UACf,iBAAc;AAAA,UAEd,0BAAAA,KAAC,gBAAa,eAAW,MAAC;AAAA;AAAA,MAC5B;AAAA;AAAA,EACF;AAEJ;;;ACrCA,SAAS,QAAQ,iBAAiB;AA0BhC,SAIQ,OAAAC,MAJR,QAAAC,aAAA;AADK,IAAM,cAAc,CAAC,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,MAC3D,gBAAAA,MAAC,SAAI,WAAW,qBACb;AAAA,QAAM,SAAS,IACd,gBAAAD,KAAC,SAAI,WAAW,2BACb,gBAAM,IAAI,CAAC,SACV,gBAAAA,KAAC,aAAyB,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,QAA7D,KAAK,GAA8D,CACpF,GACH,IACE;AAAA,EACH,MAAM,SAAS,IACd,gBAAAA,KAAC,SAAI,WAAW,2BACb,gBAAM,IAAI,CAAC,SACV,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,OAAK;AAAA,MACL,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,cAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MAC1D,SAAS,KAAK;AAAA,MAEb,eAAK;AAAA;AAAA,IARD,KAAK;AAAA,EASZ,CACD,GACH,IACE;AAAA,EACH,SAAS,gBAAAA,KAAC,SAAI,WAAW,4BAA6B,kBAAO,IAAS;AAAA,GACzE;;;ACpDF,SAAS,iBAAiB,gBAAgB,oBAAoB;AAC9D,SAAS,MAAM,aAAa;AAqCL,mBAGf,OAAAE,MAHe,QAAAC,aAAA;AALvB,IAAM,aAAa,CAAC,SAAoB;AACtC,QAAM,UACJ,gBAAAD,KAAC,SAAI,WAAW,mBACd,0BAAAC,MAAC,QAAK,SAAQ,iBAAgB,KAAK,IACjC;AAAA,oBAAAA,MAAC,SAAI,WAAW,yBACb;AAAA,WAAK,OAAO,gBAAAA,MAAA,YAAG;AAAA,aAAK;AAAA,QAAK;AAAA,SAAO,IAAM;AAAA,MACtC,KAAK;AAAA,OACR;AAAA,IACA,gBAAAD,KAAC,SAAI,WAAW,yBAA0B,eAAK,OAAM;AAAA,KACvD,GACF;AAGF,SAAO,KAAK,OACV,gBAAAA,KAAC,OAAiB,MAAM,KAAK,MAAM,WAAW,mBAC3C,qBADK,KAAK,GAEb,IAEA,gBAAAA,KAAC,SAAoB,qBAAX,KAAK,GAAc;AAEjC;AAEO,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,CAAC;AACX,MAAwB;AACtB,QAAM,eAA4B,CAAC;AAEnC,MAAI,cAAc;AAChB,iBAAa,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,MAAM,gBAAAA,KAAC,gBAAa;AAAA,MACpB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,UAAU,YAAY,aAAa;AAAA,QACvC,GAAG,IAAI,IAAI;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,SAAS;AACf,iBAAa,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,MAAM,gBAAAA,KAAC,mBAAgB;AAAA,MACvB,OAAO;AAAA,MACP,OAAO,IAAI;AAAA,IACb,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,YAAY;AAClB,iBAAa,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,MAAM,gBAAAA,KAAC,kBAAe;AAAA,MACtB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,GAAG,cAAc,GAAG,KAAK;AAEhD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO,4BAAQ,IAAI,IAAI;AAAA,MACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAClB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS,SAAS,kBAAkB;AAAA,UACpC,KAAK;AAAA,UAEJ;AAAA,qBACC,gBAAAA,MAAC,SAAI,WAAW,yBAAyB;AAAA;AAAA,cACzB;AAAA,cACb,OAAO,MACN,gBAAAD,KAAC,OAAE,MAAM,OAAO,KAAM,iBAAO,MAAK,IAElC,OAAO;AAAA,eAEX,IACE;AAAA,YACJ,gBAAAA,KAAC,SAAM;AAAA;AAAA;AAAA,MACT;AAAA,MAGF,0BAAAC,MAAC,QAAK,KAAK,IAAI,UAAQ,MAAC,WAAW,mBAChC;AAAA,YAAI,cACH,gBAAAD,KAAC,SAAI,WAAW,0BAA2B,cAAI,aAAY,IACzD;AAAA,QACH,cAAc,IAAI,UAAU;AAAA,SAC/B;AAAA;AAAA,EACF;AAEJ;;;AJjBc,SAqFA,YAAAE,WArFA,OAAAC,MAqEN,QAAAC,aArEM;AA5Ed,IAAM,iBAAiB,cAAmC;AAAA,EACxD,WAAW,MAAM;AAAA,EACjB,eAAe,MAAM;AACvB,CAAC;AAOM,IAAM,oBAAoB,MAA2B,WAAW,cAAc;AAM9E,IAAM,uBAAuB,CAAC,SAA0B;AAC7D,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAE5C,YAAU,MAAM;AACd,kBAAc,IAAI;AAClB,WAAO,MAAM,cAAc,MAAS;AAAA,EACtC,GAAG,CAAC,MAAM,aAAa,CAAC;AAC1B;AAuBA,IAAM,gBAAgB;AAEf,IAAM,UAAU,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAoB;AAClB,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,KAAK;AAChD,QAAM,gBAAgBC,aAAY,MAAM,aAAa,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;AAC3E,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK;AAChD,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAoB,MAAS;AAEjF,QAAM,iBAAiBE;AAAA,IACrB,MAAM;AAAA,MACJ,GAAI,oBAAoB,CAAC;AAAA,MACzB;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM,gBAAAJ,KAAC,iBAAc;AAAA,QACrB,SAAS,MAAM,aAAa,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,eAAeI;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA,WAAW,MAAM,aAAa,IAAI;AAAA,MAClC,eAAe;AAAA,IACjB;AAAA,IACA,CAAC,kBAAkB,gBAAgB,kBAAkB,QAAQ;AAAA,EAC/D;AAEA,QAAM,0BAA0B,MAC9B,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,CAAC,EAAE,MAAM,MAChB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,OAAO,eAAe,IAAI,CAAC,UAAU;AAAA,YACnC,GAAG;AAAA,YACH,SAAS,MAAM;AACb,mBAAK,UAAU;AACf,oBAAM;AAAA,YACR;AAAA,UACF,EAAE;AAAA,UACF,QACE,mBACE,gBAAAA;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,OAAK;AAAA,cACL,QAAM;AAAA,cACN,cAAW;AAAA,cACX,SAAS,MAAM;AACb,iCAAiB;AACjB,sBAAM;AAAA,cACR;AAAA,cACD;AAAA;AAAA,UAED,IACE;AAAA;AAAA,MAER;AAAA;AAAA,EAEJ;AAGF,QAAM,cAAc,MAAM;AACxB,QAAI,UAAU;AACZ,aACE,gBAAAL,KAAC,SAAI,WAAW,wBAAwB,eAAY,yBAClD,0BAAAA,KAAC,UAAK,WAAW,2BAA4B,UAAS,GACxD;AAAA,IAEJ;AAEA,UAAM,eAA8B;AAAA,MAClC,OAAO,YAAY,QAAQ;AAAA,IAC7B;AACA,UAAM,eAA8B;AAAA,MAClC,OAAO,YAAY,UAAU,gBAAgB,aAAa;AAAA,IAC5D;AAEA,WACE,gBAAAC,MAAC,SAAI,WAAW,iBAAiB,eAAY,kBAC3C;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,OAAO;AAAA,UACP,eAAY;AAAA,UACZ,eAAa;AAAA,UAEZ;AAAA,yBAAa,gBAAAD,KAAC,SAAI,WAAW,wBAAyB,sBAAW,IAAS;AAAA,YAC3E,gBAAAA,KAAC,SAAI,WAAW,yBAA0B,uBAAY;AAAA,YACrD,gBAAgB,gBAAAA,KAAC,SAAI,WAAW,2BAA4B,yBAAc,IAAS;AAAA;AAAA;AAAA,MACtF;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAW,yBAAyB,OAAO,cAC9C;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,sBAAsB;AAAA,YAC7B;AAAA,YACA,iBAAiB;AAAA,YACjB,SACE,gBAAAC,MAAAF,WAAA,EACG;AAAA;AAAA,cACA,yBACC,gBAAAC;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,kBACX,MAAM,gBAAAL,KAAC,kBAAe,eAAW,MAAC;AAAA,kBAClC,cAAY,wBAAwB;AAAA,kBACpC,SAAS;AAAA,kBAER,kCAAwB;AAAA;AAAA,cAC3B,IACE;AAAA,cACH,wBAAwB;AAAA,eAC3B;AAAA;AAAA,QAEJ;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAW,oBAAqB,UAAS;AAAA,SACjD;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,sBAAmB,cAClB,0BAAAC,MAAC,eAAe,UAAf,EAAwB,OAAO,cAC7B;AAAA,gBAAY;AAAA,IACb,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,KAAK;AAAA,QACjC,KAAK;AAAA,QACL,cAAc,MAAM;AAAA,QACpB,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA;AAAA,IACf;AAAA,KACF,GACF;AAEJ;;;AK9OA,SAAS,YAAAM,iBAAgC;AACzC,SAAS,UAAAC,SAAQ,QAAQ,QAAAC,OAAM,aAAAC,kBAAiB;AAChD,SAAS,qBAAqB;AAiB1B,SAwDgB,YAAAC,WAvDd,OAAAC,MADF,QAAAC,aAAA;AAFJ,IAAM,OAAO,CAAC,EAAE,OAAO,OAAO,QAAQ,MACpC,UACE,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAW,mBAAmB,SAClD;AAAA,kBAAAD,KAAC,UAAM,iBAAM;AAAA,EACZ,QAAQ,gBAAAA,KAAC,UAAM,iBAAM,IAAU;AAAA,GAClC,IAEA,gBAAAC,MAAC,SAAI,WAAW,mBACd;AAAA,kBAAAD,KAAC,UAAM,iBAAM;AAAA,EACZ,QAAQ,gBAAAA,KAAC,UAAM,iBAAM,IAAU;AAAA,GAClC;AAGG,IAAM,qBAAqB,CAAC,EAAE,SAAS,gBAAgB,MAA+B;AAC3F,QAAM,EAAE,kBAAkB,kBAAkB,kBAAkB,SAAS,IAAI,kBAAkB;AAC7F,QAAM,QAAQ,MAAM,gBAAgB,KAAK;AAEzC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAU;AAAA,MACV,OAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,QACN,QAAQ,EAAE,SAAS,OAAO;AAAA,QAC1B,MAAM,EAAE,SAAS,GAAG;AAAA,QACpB,QAAQ,EAAE,SAAS,GAAG,WAAW,OAAO;AAAA,MAC1C;AAAA,MACA,QACE,gBAAAA,KAACE,SAAA,EAAO,OAAK,MAAC,MAAK,SAAQ,MAAK,WAAU,cAAW,gBAAK,SAAS,OAAO,0BAE1E;AAAA,MAGF,0BAAAD,MAACE,OAAA,EAAK,UAAQ,MAAC,KAAK,IACjB;AAAA,4BAAoB,iBAAiB,SAAS,IAC7C,gBAAAH,KAAC,SAAI,WAAW,mBACd,0BAAAA,KAACG,OAAA,EAAK,SAAQ,gBACX,2BAAiB,IAAI,CAAC,SACrB,gBAAAH,KAACI,YAAA,EAAyB,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,QAA7D,KAAK,GAA8D,CACpF,GACH,GACF,IACE;AAAA,QAEH,WACC,gBAAAJ,KAAC,SAAI,WAAW,mBACd,0BAAAA,KAAC,QAAK,OAAM,4BAAO,OAAO,UAAU,GACtC,IACE;AAAA,QAEH,oBAAoB,iBAAiB,SAAS,IAC7C,gBAAAA,KAAC,SAAI,WAAW,mBACb,2BAAiB,IAAI,CAAC,MAAM,UAC3B,gBAAAC,MAACF,WAAA,EACC;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,OACE,gBAAAC,MAAAF,WAAA,EACG;AAAA,qBAAK;AAAA,gBAAK;AAAA,gBAAQ,KAAK;AAAA,iBAC1B;AAAA,cAEF,OAAO,gBAAAC,KAAC,iBAAc,WAAU,iBAAgB;AAAA,cAChD,SAAS,MAAM;AACb,qBAAK,UAAU;AACf,sBAAM;AAAA,cACR;AAAA;AAAA,UACF;AAAA,UACC,UAAU,iBAAiB,SAAS,IAAI,gBAAAA,KAAC,SAAI,WAAW,yBAAyB,IAAK;AAAA,aAb1E,KAAK,GAcpB,CACD,GACH,IACE;AAAA,QAEH,mBACC,gBAAAA,KAAC,SAAI,WAAW,mBACd,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAO,gBAAAA,KAAC,iBAAc,WAAU,iBAAgB;AAAA,YAChD,SAAS,MAAM;AACb,+BAAiB;AACjB,oBAAM;AAAA,YACR;AAAA;AAAA,QACF,GACF,IACE;AAAA,SACN;AAAA;AAAA,EACF;AAEJ;;;AC1GA,SAA8B,aAAAK,YAAW,YAAAC,iBAAgB;AACzD,SAAS,QAAAC,aAAY;AAQnB,gBAAAC,YAAA;AADK,IAAM,cAAc,CAAC,EAAE,MAAM,wBAAS,MAC3C,gBAAAA,KAACC,OAAA,EAAK,SAAQ,UAAS,OAAM,UAAS,WAAW,qBAC9C,eACH;AAQK,IAAM,iBAAiB,CAAC;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,MAA2B;AACzB,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAE5C,EAAAC,WAAU,MAAM;AACd,UAAM,QAAQ,OAAO,WAAW,MAAM,WAAW,IAAI,GAAG,KAAK;AAC7D,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG,CAAC,KAAK,CAAC;AAEV,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,wBAAwB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtE,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACzCA,SAAS,UAAAI,SAAQ,aAA+B;AAEhD,SAAS,kBAAAC,uBAAsB;AAK4B,gBAAAC,MA+CvD,QAAAC,aA/CuD;AAA3D,IAAM,gBAAgB,CAAC,EAAE,SAAS,MAAyB,gBAAAD,KAAC,SAAI,WAAW,uBAAwB,UAAS;AAE5G,IAAM,cAAc,CAAC,EAAE,SAAS,MAAyB,gBAAAA,KAAC,SAAI,WAAW,qBAAsB,UAAS;AAExG,IAAM,gBAAgB,CAAC,EAAE,SAAS,MAChC,gBAAAA,KAAC,cACC,0BAAAA,KAAC,SAAI,WAAW,wBAAyB,UAAS,GACpD;AAGK,IAAM,aAAa,CAAC,EAAE,WAAW,OAAO,SAAS,GAAG,MAAM,MAC/D,gBAAAA,KAACE,SAAA,EAAO,WAAW,CAAC,yBAAyB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,MAAa,GAAG,OAAO;AAGrG,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,GAAG;AACL,MACE,gBAAAF,KAACE,SAAA,EAAO,OAAc,MAAY,MAAa,GAAG,OAC/C,UACH;AAIK,IAAM,eAAe,CAAC,EAAE,WAAW,GAAG,MAAM,MACjD,gBAAAF;AAAA,EAAC,MAAM;AAAA,EAAN;AAAA,IACC,aAAY;AAAA,IACZ,aAAa,gBAAAA,KAACG,iBAAA,EAAe;AAAA,IAC7B,MAAK;AAAA,IACL,WAAS;AAAA,IACR,GAAG;AAAA,IACJ,WAAW,CAAC,2BAA2B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA;AAC5E;AAQK,IAAM,WAAW,CAAC,EAAE,mBAAmB,iBAAiB,SAAS,MAAqB;AAC3F,uBAAqB,iBAAiB;AAEtC,SACE,gBAAAF,MAAC,iBACC;AAAA,oBAAAD,KAAC,eAAa,UAAS;AAAA,IACtB,kBAAkB,gBAAAA,KAAC,iBAAe,2BAAgB,IAAmB;AAAA,KACxE;AAEJ;;;AC3DA,SAAS,QAAAI,aAAY;AAWnB,SAOW,OAAAC,OAPX,QAAAC,aAAA;AADK,IAAM,WAAW,CAAC,EAAE,OAAO,UAAU,OAAO,UAAU,MAC3D,gBAAAA;AAAA,EAACC;AAAA,EAAA;AAAA,IACC,UAAQ;AAAA,IACR,KAAK;AAAA,IACL,OAAM;AAAA,IACN,SAAQ;AAAA,IACR,WAAW,CAAC,kBAAkB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAEhE;AAAA,cAAQ,gBAAAF,MAAC,SAAI,WAAU,wBAAwB,iBAAM,IAAS;AAAA,MAC9D,WAAW,gBAAAA,MAAC,SAAI,WAAU,2BAA2B,oBAAS,IAAS;AAAA,MACvE,QAAQ,gBAAAA,MAAC,SAAK,iBAAM,IAAS;AAAA;AAAA;AAChC;;;ACtBF,SAAS,QAAAG,aAA4B;AAyDjC,gBAAAC,aAAA;AAtDG,IAAM,kBAA0C;AAAA,EACrD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,yBAAyB,CAAC,GAAG,aAAa,EAAE;AAElD,IAAM,gBAAgB,CAAC,cAA0C,gBAAgB,SAAS;AAQjG,IAAM,YAAY,CAAC,EAAE,WAAW,UAAU,QAAQ,MAAsB;AACtE,QAAM,UAAU,CAAC,gBAAgB;AACjC,MAAI,SAAU,SAAQ,KAAK,yBAAyB;AACpD,MAAI,cAAc,GAAI,SAAQ,KAAK,sBAAsB;AAEzD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,cAAc,KAAK,6BAAS,gBAAM,SAAS;AAAA,MACvD,WAAW,QAAQ,KAAK,GAAG;AAAA,MAC3B,OAAO,EAAE,iBAAiB,gBAAgB,SAAS,EAAE;AAAA,MACrD,SAAS,MAAM,QAAQ,SAAS;AAAA;AAAA,EAClC;AAEJ;AASO,IAAM,YAAY,CAAC,EAAE,OAAO,UAAU,UAAU,MACrD,gBAAAA,MAACC,OAAA,EAAK,MAAI,MAAC,KAAK,GAAI,GAAG,WACpB,iCAAuB,IAAI,CAAC,cAC3B,gBAAAD;AAAA,EAAC;AAAA;AAAA,IAEC;AAAA,IACA,UAAU,UAAU;AAAA,IACpB,SAAS,CAAC,SAAS,WAAW,IAAI;AAAA;AAAA,EAH7B,aAAa;AAIpB,CACD,GACH;;;ACpFF,SAAS,SAAAE,cAAa;AAkCd,gBAAAC,aAAA;AArBD,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,MAAwB;AACtB,QAAM,WAAW,CAAC,SAAiB;AACjC,eAAW,IAAI;AACf,QAAI,cAAe,SAAQ;AAAA,EAC7B;AAEA,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE;AAAA,MAEhC,0BAAAD,MAAC,SAAI,eAAY,gBACf,0BAAAA,MAAC,aAAU,OAAc,UAAU,UAAU,WAAW,EAAE,KAAK,IAAI,SAAS,SAAS,GAAG,GAC1F;AAAA;AAAA,EACF;AAEJ;;;ACtCA,SAAyB,YAAAE,iBAAgB;AACzC,SAAS,UAAAC,SAAQ,KAAK,UAAAC,SAAQ,QAAAC,OAAM,SAAAC,QAAO,WAAW;AACtD,SAAS,gBAAgB,oBAAoB;AAwDhC,SA+BH,YAAAC,WA/BG,OAAAC,OA+BH,QAAAC,aA/BG;AAzBN,IAAM,iBAAiB,CAAC;AAAA,EAC7B,UAAU;AAAA,EACV,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY;AAAA,EACZ;AACF,MAA2B;AACzB,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,KAAK;AAClD,QAAM,aAAa,WAAW;AAE9B,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS;AACX,aAAO,gBAAAF,MAAC,YAAS,OAAO,cAAc,UAAU,aAAa;AAAA,IAC/D;AACA,QAAI,SAAS;AACX,aAAO,gBAAAA,MAAC,YAAS,UAAU,aAAa;AAAA,IAC1C;AACA,QAAI,OAAO;AACT,aACE,gBAAAA,MAAC,SAAI,eAAY,oBACf,0BAAAA,MAAC,YAAS,OAAO,YAAY,UAAU,WAAW,GACpD;AAAA,IAEJ;AAEA,WACE,gBAAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,UAAQ;AAAA,QACR,OAAM;AAAA,QACN,KAAK;AAAA,QACL,WAAU;AAAA,QACV,eAAY;AAAA,QAEX;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE,gBAAAF,MAAAF,WAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,iBACE,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,cAAW,MAAM,gBAAAA,MAAC,gBAAa,GAAI,cAAW,gBAAK,SAAS,QAAQ;AAAA,UACpE,aACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,oBAAoB,gBAAAA,MAAC,kBAAe;AAAA,cAC1C,cAAW;AAAA,cACX,SAAS,MAAM,cAAc,IAAI;AAAA;AAAA,UACnC,IACE;AAAA,UACJ,gBAAAA,MAAC,gBAAa,cAAc,SAAS,UAAoB;AAAA,WAC3D;AAAA,QAGF,0BAAAC,MAACE,OAAA,EAAK,UAAQ,MAAC,KAAK,IAAI,OAAM,UAAS,WAAU,oBAC/C;AAAA,0BAAAH,MAAC,eACC,0BAAAA;AAAA,YAACI,OAAM;AAAA,YAAN;AAAA,cACC;AAAA,cACA,aAAa;AAAA,cACb,WAAS;AAAA,cACT,MAAK;AAAA,cACL,cAAc;AAAA,cACd;AAAA,cACA,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd,GACF;AAAA,UACC,aAAa,gBAAAJ,MAAC,eAAa,mBAAQ,IAAiB;AAAA,UACpD,WAAW;AAAA,WACd;AAAA;AAAA,IACF;AAAA,IAEC,aACC,gBAAAA,MAAC,cACC,0BAAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,MAAM,cAAc,KAAK;AAAA,QAClC,WAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,QAAQ,EAAE,SAAS,GAAG,QAAQ,OAAO;AAAA,UACrC,QAAQ,EAAE,WAAW,UAAU,SAAS,EAAE;AAAA,QAC5C;AAAA,QACA,QACE,gBAAAL,MAAC,OAAI,QAAQ,GACX,0BAAAA,MAAC,OAAI,MAAK,KACR,0BAAAA,MAACM,SAAA,EAAO,OAAK,MAAC,MAAK,SAAQ,SAAS,MAAM,cAAc,KAAK,GAAG,0BAEhE,GACF,GACF;AAAA,QAGF,0BAAAN,MAACG,OAAA,EAAK,UAAQ,MAAC,KAAK,IAAI,WAAU,2BAA0B,OAAM,UAC/D,mBACH;AAAA;AAAA,IACF,GACF,IACE;AAAA,KACN;AAEJ;;;AC1HM,SACE,OAAAI,OADF,QAAAC,aAAA;AAdC,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAA0B;AACxB,QAAM,YACJ,cAAc,SACV,mDACA;AAEN,SACE,gBAAAA,MAAC,SAAI,WAAU,mBAAkB,eAAY,mBAC3C;AAAA,oBAAAA,MAAC,YAAO,WAAU,0BAChB;AAAA,sBAAAD,MAAC,SAAI,WAAU,yBAAyB,iBAAM;AAAA,MAC7C,YAAY,QAAQ,aAAa,KAChC,gBAAAA,MAAC,SAAI,WAAU,4BAA4B,oBAAS,IAClD;AAAA,MACH,eAAe,OACd,gBAAAA,MAAC,SAAI,WAAU,gCAAgC,uBAAY,IACzD;AAAA,OACN;AAAA,IACC,YAAY,OAAO,gBAAAA,MAAC,SAAI,WAAW,WAAY,UAAS,IAAS;AAAA,KACpE;AAEJ;","names":["useMemo","useMemo","useCallback","useMemo","useState","Button","jsx","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","useCallback","useMemo","Button","Fragment","Button","Flex","Statistic","Fragment","jsx","jsxs","Button","Flex","Statistic","useEffect","useState","Flex","jsx","Flex","useState","useEffect","Button","SearchOutlined","jsx","jsxs","Button","SearchOutlined","Flex","jsx","jsxs","Flex","Flex","jsx","Flex","Modal","jsx","Modal","useState","Button","Drawer","Flex","Input","Fragment","jsx","jsxs","useState","Flex","Input","Drawer","Button","jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hopgoldy/cube-ui",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Shared responsive application shell and UI primitives for Cube applications",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/HoPGoldy/cube-module#readme",