automoby-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +172 -0
  2. package/dist/index.cjs.js +3022 -0
  3. package/dist/index.cjs.js.map +1 -0
  4. package/dist/index.esm.js +3006 -0
  5. package/dist/index.esm.js.map +1 -0
  6. package/dist/types/components/Accordion/Accordion.d.ts +25 -0
  7. package/dist/types/components/Accordion/Accordion.stories.d.ts +174 -0
  8. package/dist/types/components/Backdrop/Backdrop.d.ts +20 -0
  9. package/dist/types/components/Backdrop/Backdrop.stories.d.ts +9 -0
  10. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +13 -0
  11. package/dist/types/components/Breadcrumb/Breadcrumb.stories.d.ts +176 -0
  12. package/dist/types/components/Button/Button.d.ts +13 -0
  13. package/dist/types/components/Button/Button.stories.d.ts +100 -0
  14. package/dist/types/components/Chips/Chips.d.ts +37 -0
  15. package/dist/types/components/Chips/Chips.stories.d.ts +90 -0
  16. package/dist/types/components/Divider/Divider.d.ts +25 -0
  17. package/dist/types/components/Divider/Divider.stories.d.ts +88 -0
  18. package/dist/types/components/Drawer/Drawer.d.ts +12 -0
  19. package/dist/types/components/Drawer/Drawer.stories.d.ts +115 -0
  20. package/dist/types/components/Input/Input.d.ts +16 -0
  21. package/dist/types/components/Input/Input.stories.d.ts +130 -0
  22. package/dist/types/components/Menu/Menu.d.ts +39 -0
  23. package/dist/types/components/Menu/Menu.stories.d.ts +89 -0
  24. package/dist/types/components/Pagination/Pagination.d.ts +8 -0
  25. package/dist/types/components/Pagination/Pagination.stories.d.ts +61 -0
  26. package/dist/types/components/ProtectedComponent.d.ts +5 -0
  27. package/dist/types/components/RadioGroup/RadioGroup.d.ts +55 -0
  28. package/dist/types/components/RadioGroup/RadioGroup.stories.d.ts +86 -0
  29. package/dist/types/components/Tabs/Tabs.d.ts +43 -0
  30. package/dist/types/components/Tabs/Tabs.stories.d.ts +66 -0
  31. package/dist/types/components/Typography/Typography.d.ts +9 -0
  32. package/dist/types/components/Typography/Typography.stories.d.ts +57 -0
  33. package/dist/types/contexts/MobileContext.d.ts +13 -0
  34. package/dist/types/contexts/index.d.ts +2 -0
  35. package/dist/types/index.d.ts +33 -0
  36. package/dist/types/licensing/LicenseManager.d.ts +41 -0
  37. package/dist/types/licensing/index.d.ts +30 -0
  38. package/dist/types/utils/cn.d.ts +2 -0
  39. package/package.json +90 -0
@@ -0,0 +1,3006 @@
1
+ import React, { createContext, useMemo, useState, useId, useRef, useEffect, forwardRef, createElement } from 'react';
2
+
3
+ var jsxRuntime = {exports: {}};
4
+
5
+ var reactJsxRuntime_production = {};
6
+
7
+ /**
8
+ * @license React
9
+ * react-jsx-runtime.production.js
10
+ *
11
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
12
+ *
13
+ * This source code is licensed under the MIT license found in the
14
+ * LICENSE file in the root directory of this source tree.
15
+ */
16
+
17
+ var hasRequiredReactJsxRuntime_production;
18
+
19
+ function requireReactJsxRuntime_production () {
20
+ if (hasRequiredReactJsxRuntime_production) return reactJsxRuntime_production;
21
+ hasRequiredReactJsxRuntime_production = 1;
22
+ var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),
23
+ REACT_FRAGMENT_TYPE = Symbol.for("react.fragment");
24
+ function jsxProd(type, config, maybeKey) {
25
+ var key = null;
26
+ void 0 !== maybeKey && (key = "" + maybeKey);
27
+ void 0 !== config.key && (key = "" + config.key);
28
+ if ("key" in config) {
29
+ maybeKey = {};
30
+ for (var propName in config)
31
+ "key" !== propName && (maybeKey[propName] = config[propName]);
32
+ } else maybeKey = config;
33
+ config = maybeKey.ref;
34
+ return {
35
+ $$typeof: REACT_ELEMENT_TYPE,
36
+ type: type,
37
+ key: key,
38
+ ref: void 0 !== config ? config : null,
39
+ props: maybeKey
40
+ };
41
+ }
42
+ reactJsxRuntime_production.Fragment = REACT_FRAGMENT_TYPE;
43
+ reactJsxRuntime_production.jsx = jsxProd;
44
+ reactJsxRuntime_production.jsxs = jsxProd;
45
+ return reactJsxRuntime_production;
46
+ }
47
+
48
+ var reactJsxRuntime_development = {};
49
+
50
+ /**
51
+ * @license React
52
+ * react-jsx-runtime.development.js
53
+ *
54
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
55
+ *
56
+ * This source code is licensed under the MIT license found in the
57
+ * LICENSE file in the root directory of this source tree.
58
+ */
59
+
60
+ var hasRequiredReactJsxRuntime_development;
61
+
62
+ function requireReactJsxRuntime_development () {
63
+ if (hasRequiredReactJsxRuntime_development) return reactJsxRuntime_development;
64
+ hasRequiredReactJsxRuntime_development = 1;
65
+ "production" !== process.env.NODE_ENV &&
66
+ (function () {
67
+ function getComponentNameFromType(type) {
68
+ if (null == type) return null;
69
+ if ("function" === typeof type)
70
+ return type.$$typeof === REACT_CLIENT_REFERENCE
71
+ ? null
72
+ : type.displayName || type.name || null;
73
+ if ("string" === typeof type) return type;
74
+ switch (type) {
75
+ case REACT_FRAGMENT_TYPE:
76
+ return "Fragment";
77
+ case REACT_PROFILER_TYPE:
78
+ return "Profiler";
79
+ case REACT_STRICT_MODE_TYPE:
80
+ return "StrictMode";
81
+ case REACT_SUSPENSE_TYPE:
82
+ return "Suspense";
83
+ case REACT_SUSPENSE_LIST_TYPE:
84
+ return "SuspenseList";
85
+ case REACT_ACTIVITY_TYPE:
86
+ return "Activity";
87
+ }
88
+ if ("object" === typeof type)
89
+ switch (
90
+ ("number" === typeof type.tag &&
91
+ console.error(
92
+ "Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."
93
+ ),
94
+ type.$$typeof)
95
+ ) {
96
+ case REACT_PORTAL_TYPE:
97
+ return "Portal";
98
+ case REACT_CONTEXT_TYPE:
99
+ return (type.displayName || "Context") + ".Provider";
100
+ case REACT_CONSUMER_TYPE:
101
+ return (type._context.displayName || "Context") + ".Consumer";
102
+ case REACT_FORWARD_REF_TYPE:
103
+ var innerType = type.render;
104
+ type = type.displayName;
105
+ type ||
106
+ ((type = innerType.displayName || innerType.name || ""),
107
+ (type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef"));
108
+ return type;
109
+ case REACT_MEMO_TYPE:
110
+ return (
111
+ (innerType = type.displayName || null),
112
+ null !== innerType
113
+ ? innerType
114
+ : getComponentNameFromType(type.type) || "Memo"
115
+ );
116
+ case REACT_LAZY_TYPE:
117
+ innerType = type._payload;
118
+ type = type._init;
119
+ try {
120
+ return getComponentNameFromType(type(innerType));
121
+ } catch (x) {}
122
+ }
123
+ return null;
124
+ }
125
+ function testStringCoercion(value) {
126
+ return "" + value;
127
+ }
128
+ function checkKeyStringCoercion(value) {
129
+ try {
130
+ testStringCoercion(value);
131
+ var JSCompiler_inline_result = !1;
132
+ } catch (e) {
133
+ JSCompiler_inline_result = true;
134
+ }
135
+ if (JSCompiler_inline_result) {
136
+ JSCompiler_inline_result = console;
137
+ var JSCompiler_temp_const = JSCompiler_inline_result.error;
138
+ var JSCompiler_inline_result$jscomp$0 =
139
+ ("function" === typeof Symbol &&
140
+ Symbol.toStringTag &&
141
+ value[Symbol.toStringTag]) ||
142
+ value.constructor.name ||
143
+ "Object";
144
+ JSCompiler_temp_const.call(
145
+ JSCompiler_inline_result,
146
+ "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",
147
+ JSCompiler_inline_result$jscomp$0
148
+ );
149
+ return testStringCoercion(value);
150
+ }
151
+ }
152
+ function getTaskName(type) {
153
+ if (type === REACT_FRAGMENT_TYPE) return "<>";
154
+ if (
155
+ "object" === typeof type &&
156
+ null !== type &&
157
+ type.$$typeof === REACT_LAZY_TYPE
158
+ )
159
+ return "<...>";
160
+ try {
161
+ var name = getComponentNameFromType(type);
162
+ return name ? "<" + name + ">" : "<...>";
163
+ } catch (x) {
164
+ return "<...>";
165
+ }
166
+ }
167
+ function getOwner() {
168
+ var dispatcher = ReactSharedInternals.A;
169
+ return null === dispatcher ? null : dispatcher.getOwner();
170
+ }
171
+ function UnknownOwner() {
172
+ return Error("react-stack-top-frame");
173
+ }
174
+ function hasValidKey(config) {
175
+ if (hasOwnProperty.call(config, "key")) {
176
+ var getter = Object.getOwnPropertyDescriptor(config, "key").get;
177
+ if (getter && getter.isReactWarning) return false;
178
+ }
179
+ return void 0 !== config.key;
180
+ }
181
+ function defineKeyPropWarningGetter(props, displayName) {
182
+ function warnAboutAccessingKey() {
183
+ specialPropKeyWarningShown ||
184
+ ((specialPropKeyWarningShown = true),
185
+ console.error(
186
+ "%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",
187
+ displayName
188
+ ));
189
+ }
190
+ warnAboutAccessingKey.isReactWarning = true;
191
+ Object.defineProperty(props, "key", {
192
+ get: warnAboutAccessingKey,
193
+ configurable: true
194
+ });
195
+ }
196
+ function elementRefGetterWithDeprecationWarning() {
197
+ var componentName = getComponentNameFromType(this.type);
198
+ didWarnAboutElementRef[componentName] ||
199
+ ((didWarnAboutElementRef[componentName] = true),
200
+ console.error(
201
+ "Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release."
202
+ ));
203
+ componentName = this.props.ref;
204
+ return void 0 !== componentName ? componentName : null;
205
+ }
206
+ function ReactElement(
207
+ type,
208
+ key,
209
+ self,
210
+ source,
211
+ owner,
212
+ props,
213
+ debugStack,
214
+ debugTask
215
+ ) {
216
+ self = props.ref;
217
+ type = {
218
+ $$typeof: REACT_ELEMENT_TYPE,
219
+ type: type,
220
+ key: key,
221
+ props: props,
222
+ _owner: owner
223
+ };
224
+ null !== (void 0 !== self ? self : null)
225
+ ? Object.defineProperty(type, "ref", {
226
+ enumerable: false,
227
+ get: elementRefGetterWithDeprecationWarning
228
+ })
229
+ : Object.defineProperty(type, "ref", { enumerable: false, value: null });
230
+ type._store = {};
231
+ Object.defineProperty(type._store, "validated", {
232
+ configurable: false,
233
+ enumerable: false,
234
+ writable: true,
235
+ value: 0
236
+ });
237
+ Object.defineProperty(type, "_debugInfo", {
238
+ configurable: false,
239
+ enumerable: false,
240
+ writable: true,
241
+ value: null
242
+ });
243
+ Object.defineProperty(type, "_debugStack", {
244
+ configurable: false,
245
+ enumerable: false,
246
+ writable: true,
247
+ value: debugStack
248
+ });
249
+ Object.defineProperty(type, "_debugTask", {
250
+ configurable: false,
251
+ enumerable: false,
252
+ writable: true,
253
+ value: debugTask
254
+ });
255
+ Object.freeze && (Object.freeze(type.props), Object.freeze(type));
256
+ return type;
257
+ }
258
+ function jsxDEVImpl(
259
+ type,
260
+ config,
261
+ maybeKey,
262
+ isStaticChildren,
263
+ source,
264
+ self,
265
+ debugStack,
266
+ debugTask
267
+ ) {
268
+ var children = config.children;
269
+ if (void 0 !== children)
270
+ if (isStaticChildren)
271
+ if (isArrayImpl(children)) {
272
+ for (
273
+ isStaticChildren = 0;
274
+ isStaticChildren < children.length;
275
+ isStaticChildren++
276
+ )
277
+ validateChildKeys(children[isStaticChildren]);
278
+ Object.freeze && Object.freeze(children);
279
+ } else
280
+ console.error(
281
+ "React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead."
282
+ );
283
+ else validateChildKeys(children);
284
+ if (hasOwnProperty.call(config, "key")) {
285
+ children = getComponentNameFromType(type);
286
+ var keys = Object.keys(config).filter(function (k) {
287
+ return "key" !== k;
288
+ });
289
+ isStaticChildren =
290
+ 0 < keys.length
291
+ ? "{key: someKey, " + keys.join(": ..., ") + ": ...}"
292
+ : "{key: someKey}";
293
+ didWarnAboutKeySpread[children + isStaticChildren] ||
294
+ ((keys =
295
+ 0 < keys.length ? "{" + keys.join(": ..., ") + ": ...}" : "{}"),
296
+ console.error(
297
+ 'A props object containing a "key" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />',
298
+ isStaticChildren,
299
+ children,
300
+ keys,
301
+ children
302
+ ),
303
+ (didWarnAboutKeySpread[children + isStaticChildren] = true));
304
+ }
305
+ children = null;
306
+ void 0 !== maybeKey &&
307
+ (checkKeyStringCoercion(maybeKey), (children = "" + maybeKey));
308
+ hasValidKey(config) &&
309
+ (checkKeyStringCoercion(config.key), (children = "" + config.key));
310
+ if ("key" in config) {
311
+ maybeKey = {};
312
+ for (var propName in config)
313
+ "key" !== propName && (maybeKey[propName] = config[propName]);
314
+ } else maybeKey = config;
315
+ children &&
316
+ defineKeyPropWarningGetter(
317
+ maybeKey,
318
+ "function" === typeof type
319
+ ? type.displayName || type.name || "Unknown"
320
+ : type
321
+ );
322
+ return ReactElement(
323
+ type,
324
+ children,
325
+ self,
326
+ source,
327
+ getOwner(),
328
+ maybeKey,
329
+ debugStack,
330
+ debugTask
331
+ );
332
+ }
333
+ function validateChildKeys(node) {
334
+ "object" === typeof node &&
335
+ null !== node &&
336
+ node.$$typeof === REACT_ELEMENT_TYPE &&
337
+ node._store &&
338
+ (node._store.validated = 1);
339
+ }
340
+ var React$1 = React,
341
+ REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),
342
+ REACT_PORTAL_TYPE = Symbol.for("react.portal"),
343
+ REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"),
344
+ REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"),
345
+ REACT_PROFILER_TYPE = Symbol.for("react.profiler");
346
+ var REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),
347
+ REACT_CONTEXT_TYPE = Symbol.for("react.context"),
348
+ REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"),
349
+ REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"),
350
+ REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"),
351
+ REACT_MEMO_TYPE = Symbol.for("react.memo"),
352
+ REACT_LAZY_TYPE = Symbol.for("react.lazy"),
353
+ REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),
354
+ REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"),
355
+ ReactSharedInternals =
356
+ React$1.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,
357
+ hasOwnProperty = Object.prototype.hasOwnProperty,
358
+ isArrayImpl = Array.isArray,
359
+ createTask = console.createTask
360
+ ? console.createTask
361
+ : function () {
362
+ return null;
363
+ };
364
+ React$1 = {
365
+ "react-stack-bottom-frame": function (callStackForError) {
366
+ return callStackForError();
367
+ }
368
+ };
369
+ var specialPropKeyWarningShown;
370
+ var didWarnAboutElementRef = {};
371
+ var unknownOwnerDebugStack = React$1["react-stack-bottom-frame"].bind(
372
+ React$1,
373
+ UnknownOwner
374
+ )();
375
+ var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));
376
+ var didWarnAboutKeySpread = {};
377
+ reactJsxRuntime_development.Fragment = REACT_FRAGMENT_TYPE;
378
+ reactJsxRuntime_development.jsx = function (type, config, maybeKey, source, self) {
379
+ var trackActualOwner =
380
+ 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;
381
+ return jsxDEVImpl(
382
+ type,
383
+ config,
384
+ maybeKey,
385
+ false,
386
+ source,
387
+ self,
388
+ trackActualOwner
389
+ ? Error("react-stack-top-frame")
390
+ : unknownOwnerDebugStack,
391
+ trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask
392
+ );
393
+ };
394
+ reactJsxRuntime_development.jsxs = function (type, config, maybeKey, source, self) {
395
+ var trackActualOwner =
396
+ 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;
397
+ return jsxDEVImpl(
398
+ type,
399
+ config,
400
+ maybeKey,
401
+ true,
402
+ source,
403
+ self,
404
+ trackActualOwner
405
+ ? Error("react-stack-top-frame")
406
+ : unknownOwnerDebugStack,
407
+ trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask
408
+ );
409
+ };
410
+ })();
411
+ return reactJsxRuntime_development;
412
+ }
413
+
414
+ var hasRequiredJsxRuntime;
415
+
416
+ function requireJsxRuntime () {
417
+ if (hasRequiredJsxRuntime) return jsxRuntime.exports;
418
+ hasRequiredJsxRuntime = 1;
419
+
420
+ if (process.env.NODE_ENV === 'production') {
421
+ jsxRuntime.exports = requireReactJsxRuntime_production();
422
+ } else {
423
+ jsxRuntime.exports = requireReactJsxRuntime_development();
424
+ }
425
+ return jsxRuntime.exports;
426
+ }
427
+
428
+ var jsxRuntimeExports = requireJsxRuntime();
429
+
430
+ /**
431
+ * License Manager for Automoby Kit
432
+ * Handles runtime key validation and component access control
433
+ */
434
+ class LicenseManager {
435
+ static instance;
436
+ isInitialized = false;
437
+ isValid = false;
438
+ licenseKey = null;
439
+ // Valid license keys - in production, these would be validated against your backend
440
+ validKeys = ['automoby-kit-war-key-2025'];
441
+ constructor() {
442
+ // Private constructor for singleton pattern
443
+ }
444
+ static getInstance() {
445
+ if (!LicenseManager.instance) {
446
+ LicenseManager.instance = new LicenseManager();
447
+ }
448
+ return LicenseManager.instance;
449
+ }
450
+ /**
451
+ * Initialize the license with provided configuration
452
+ */
453
+ initialize(config) {
454
+ try {
455
+ this.licenseKey = config.key;
456
+ // Validate the license key
457
+ this.isValid = this.validateLicense(config.key);
458
+ this.isInitialized = true;
459
+ if (this.isValid) {
460
+ console.log('✅ Automoby Kit initialized successfully');
461
+ return true;
462
+ }
463
+ console.error('❌ Invalid license key provided for Automoby Kit');
464
+ return false;
465
+ }
466
+ catch (error) {
467
+ console.error('❌ Failed to initialize Automoby Kit:', error);
468
+ this.isValid = false;
469
+ this.isInitialized = true;
470
+ return false;
471
+ }
472
+ }
473
+ /**
474
+ * Validate license key (in production, this would call your backend)
475
+ */
476
+ validateLicense(key) {
477
+ // Basic validation - empty key is invalid
478
+ if (!key || key.trim() === '') {
479
+ return false;
480
+ }
481
+ // For demo purposes, we're using hardcoded keys
482
+ // In production, you would validate against your backend API
483
+ return this.validKeys.includes(key);
484
+ }
485
+ /**
486
+ * Check if the license is valid and components can be used
487
+ */
488
+ canUseComponents() {
489
+ if (!this.isInitialized) {
490
+ console.error('❌ Automoby Kit not initialized. Please call initializeAutomobiKit() with your license key.');
491
+ return false;
492
+ }
493
+ if (!this.isValid) {
494
+ console.error('❌ Invalid license key. Please contact support or provide a valid license key.');
495
+ return false;
496
+ }
497
+ return true;
498
+ }
499
+ /**
500
+ * Get current license status
501
+ */
502
+ getLicenseStatus() {
503
+ return {
504
+ initialized: this.isInitialized,
505
+ valid: this.isValid,
506
+ key: this.licenseKey ? `${this.licenseKey.substring(0, 8)}...` : null,
507
+ };
508
+ }
509
+ /**
510
+ * Reset license state (useful for testing)
511
+ */
512
+ reset() {
513
+ this.isInitialized = false;
514
+ this.isValid = false;
515
+ this.licenseKey = null;
516
+ }
517
+ }
518
+
519
+ /**
520
+ * Initialize Automoby Kit with your license key
521
+ * This function must be called before using any components
522
+ *
523
+ * @param config - License configuration
524
+ * @returns boolean indicating success
525
+ *
526
+ * @example
527
+ * ```typescript
528
+ * import { initializeAutomobiKit } from 'automoby-kit';
529
+ *
530
+ * // Initialize with your license key
531
+ * const success = initializeAutomobiKit({
532
+ * key: 'your-license-key-here',
533
+ * domain: 'yourdomain.com', // optional
534
+ * environment: 'production' // optional
535
+ * });
536
+ *
537
+ * if (success) {
538
+ * // Now you can use components
539
+ * }
540
+ * ```
541
+ */
542
+ function initializeAutomobiKit(config) {
543
+ const licenseManager = LicenseManager.getInstance();
544
+ return licenseManager.initialize(config);
545
+ }
546
+ /**
547
+ * Check if components can be used
548
+ */
549
+ function canUseComponents() {
550
+ const licenseManager = LicenseManager.getInstance();
551
+ return licenseManager.canUseComponents();
552
+ }
553
+
554
+ /**
555
+ * Higher-order component that protects components with license validation
556
+ */
557
+ function withLicenseProtection(Component, componentName) {
558
+ const ProtectedComponent = React.forwardRef((props, ref) => {
559
+ if (!canUseComponents()) {
560
+ // Return a placeholder component with error styling
561
+ return (jsxRuntimeExports.jsxs("div", { style: {
562
+ padding: '16px',
563
+ border: '2px dashed #ef4444',
564
+ borderRadius: '8px',
565
+ backgroundColor: '#fef2f2',
566
+ color: '#dc2626',
567
+ textAlign: 'center',
568
+ fontFamily: 'system-ui, sans-serif',
569
+ fontSize: '14px',
570
+ maxWidth: '400px',
571
+ margin: '16px auto',
572
+ }, children: [jsxRuntimeExports.jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDD12 License Required" }), jsxRuntimeExports.jsxs("div", { style: { marginBottom: '8px' }, children: ["Component \"", componentName, "\" requires a valid license key."] }), jsxRuntimeExports.jsx("div", { style: { fontSize: '12px', opacity: 0.8 }, children: "Please initialize Automoby Kit with your license key before using components." })] }));
573
+ }
574
+ // If license is valid, render the actual component
575
+ // Use type assertion to handle the generic component props properly
576
+ return jsxRuntimeExports.jsx(Component, { ...props, ref: ref });
577
+ });
578
+ ProtectedComponent.displayName = `Protected(${componentName})`;
579
+ return ProtectedComponent;
580
+ }
581
+
582
+ function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
583
+
584
+ function cn(...inputs) {
585
+ return clsx(inputs);
586
+ }
587
+
588
+ const variantClasses$1 = {
589
+ // Headings with Fat weight (900)
590
+ h1: 'text-[36px] font-[var(--font-weight-fat)]',
591
+ h2: 'text-[32px] font-[var(--font-weight-fat)]',
592
+ h3: 'text-[28px] font-[var(--font-weight-fat)]',
593
+ h4: 'text-[24px] font-[var(--font-weight-heavy)]',
594
+ h5: 'text-[22px] font-[var(--font-weight-heavy)]',
595
+ h6: 'text-[20px] font-[var(--font-weight-heavy)]',
596
+ // Body Copy with specific weight variants
597
+ 'body-xl-heavy': 'text-[20px] font-[var(--font-weight-heavy)]',
598
+ 'body-l-heavy': 'text-[18px] font-[var(--font-weight-heavy)]',
599
+ 'body-l-bold': 'text-[18px] font-[var(--font-weight-bold)]',
600
+ 'body-l-medium': 'text-[18px] font-[var(--font-weight-medium)]',
601
+ 'body-m-heavy': 'text-[16px] font-[var(--font-weight-heavy)]',
602
+ 'body-m-bold': 'text-[16px] font-[var(--font-weight-bold)]',
603
+ 'body-m-medium': 'text-[16px] font-[var(--font-weight-medium)]',
604
+ 'body-s-heavy': 'text-[14px] font-[var(--font-weight-heavy)]',
605
+ 'body-s-bold': 'text-[14px] font-[var(--font-weight-bold)]',
606
+ 'body-s-medium': 'text-[14px] font-[var(--font-weight-medium)]',
607
+ 'body-ms-bold': 'text-[13px] font-[var(--font-weight-bold)]',
608
+ 'body-ms-medium': 'text-[13px] font-[var(--font-weight-medium)]',
609
+ 'body-xs-bold': 'text-[12px] font-[var(--font-weight-bold)]',
610
+ 'body-xs-medium': 'text-[12px] font-[var(--font-weight-medium)]',
611
+ 'body-t-bold': 'text-[10px] font-[var(--font-weight-bold)]',
612
+ 'body-t-medium': 'text-[10px] font-[var(--font-weight-medium)]',
613
+ 'body-ss-medium': 'text-[9px] font-[var(--font-weight-medium)]',
614
+ };
615
+ // Export for reuse in other components
616
+ const getTypographyClasses = (variant) => {
617
+ return variantClasses$1[variant];
618
+ };
619
+ const colorClasses = {
620
+ primary: 'text-[var(--color-primary)]',
621
+ secondary: 'text-[var(--color-secondary)]',
622
+ 'neutral-darker': 'text-[var(--color-neutral-darker)]',
623
+ 'neutral-dark': 'text-[var(--color-neutral-dark)]',
624
+ 'neutral-main': 'text-[var(--color-neutral-main)]',
625
+ white: 'text-[var(--color-white)]',
626
+ inherit: 'text-inherit',
627
+ };
628
+ const getDefaultElement = (variant) => {
629
+ if (variant.startsWith('h'))
630
+ return variant.split('-')[0]; // h1, h2, etc.
631
+ return 'p';
632
+ };
633
+ const Typography$1 = React.forwardRef(({ variant = 'body-m-medium', color = 'inherit', as, className, children, ...props }, ref) => {
634
+ const Element = as || getDefaultElement(variant);
635
+ return React.createElement(Element, {
636
+ ref,
637
+ className: cn(variantClasses$1[variant], colorClasses[color], 'leading-[var(--leading-default)]', // 180% line height
638
+ className),
639
+ ...props,
640
+ }, children);
641
+ });
642
+ Typography$1.displayName = 'Typography';
643
+
644
+ const sizeClasses = {
645
+ sm: 'px-[16px] py-[7px]',
646
+ md: 'px-[16px] py-[9px]',
647
+ lg: 'px-[16px] py-[13px]',
648
+ xl: 'px-[20px] py-[13px]',
649
+ };
650
+ const defaultTextVariants = {
651
+ sm: 'body-s-bold', // 14px / Bold (600)
652
+ md: 'body-m-bold', // 16px / Bold (600)
653
+ lg: 'body-l-bold', // 18px / Bold (600)
654
+ xl: 'body-xl-heavy', // 20px / Heavy (700)
655
+ };
656
+ const variantClasses = {
657
+ primary: `
658
+ bg-[var(--color-primary)] text-white
659
+ hover:bg-[var(--color-primary-dark)]
660
+ disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]
661
+ `,
662
+ secondary: `
663
+ bg-[var(--color-primary-lightest)] text-[var(--color-primary)]
664
+ hover:bg-[var(--color-primary-lighter)]
665
+ disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]
666
+ `,
667
+ tertiary: `
668
+ bg-white border border-[var(--color-primary-light)] text-[var(--color-primary)]
669
+ hover:bg-[var(--color-neutral-lighter)]
670
+ disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]
671
+ `,
672
+ ghost: `
673
+ bg-transparent text-[var(--color-primary)]
674
+ hover:bg-[var(--color-primary-lightest)]
675
+ disabled:bg-[var(--color-neutral-light)] disabled:text-[var(--color-neutral-darker)]
676
+ `,
677
+ };
678
+ const Button$1 = React.forwardRef(({ className, variant = 'primary', size = 'md', icon, iconPosition = 'right', children, loading = false, disabled, textVariant, ...props }, ref) => {
679
+ const finalTextVariant = textVariant || defaultTextVariants[size];
680
+ return (jsxRuntimeExports.jsxs("button", { ref: ref, type: "button", className: cn('inline-flex items-center justify-center rounded-[8px] transition-colors duration-200', sizeClasses[size], variantClasses[variant], getTypographyClasses(finalTextVariant), disabled && 'opacity-50 pointer-events-none', className), disabled: disabled || loading, ...props, children: [icon && iconPosition === 'left' && (jsxRuntimeExports.jsx("span", { className: "mr-2 flex items-center", children: icon })), loading ? '...' : children, icon && iconPosition === 'right' && (jsxRuntimeExports.jsx("span", { className: "ml-2 flex items-center", children: icon }))] }));
681
+ });
682
+ Button$1.displayName = 'Button';
683
+
684
+ // Generated ESM version of ua-parser-js
685
+ // DO NOT EDIT THIS FILE!
686
+ // Source: /src/main/ua-parser.js
687
+
688
+ /////////////////////////////////////////////////////////////////////////////////
689
+ /* UAParser.js v2.0.4
690
+ Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
691
+ AGPLv3 License *//*
692
+ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
693
+ Supports browser & node.js environment.
694
+ Demo : https://uaparser.dev
695
+ Source : https://github.com/faisalman/ua-parser-js */
696
+ /////////////////////////////////////////////////////////////////////////////////
697
+
698
+ /* jshint esversion: 6 */
699
+ /* globals window */
700
+
701
+
702
+
703
+ //////////////
704
+ // Constants
705
+ /////////////
706
+
707
+ var LIBVERSION = '2.0.4',
708
+ UA_MAX_LENGTH = 500,
709
+ USER_AGENT = 'user-agent',
710
+ EMPTY = '',
711
+ UNKNOWN = '?',
712
+
713
+ // typeof
714
+ FUNC_TYPE = 'function',
715
+ UNDEF_TYPE = 'undefined',
716
+ OBJ_TYPE = 'object',
717
+ STR_TYPE = 'string',
718
+
719
+ // properties
720
+ UA_BROWSER = 'browser',
721
+ UA_CPU = 'cpu',
722
+ UA_DEVICE = 'device',
723
+ UA_ENGINE = 'engine',
724
+ UA_OS = 'os',
725
+ UA_RESULT = 'result',
726
+
727
+ NAME = 'name',
728
+ TYPE = 'type',
729
+ VENDOR = 'vendor',
730
+ VERSION = 'version',
731
+ ARCHITECTURE= 'architecture',
732
+ MAJOR = 'major',
733
+ MODEL = 'model',
734
+
735
+ // device types
736
+ CONSOLE = 'console',
737
+ MOBILE = 'mobile',
738
+ TABLET = 'tablet',
739
+ SMARTTV = 'smarttv',
740
+ WEARABLE = 'wearable',
741
+ XR = 'xr',
742
+ EMBEDDED = 'embedded',
743
+
744
+ // browser types
745
+ INAPP = 'inapp',
746
+
747
+ // client hints
748
+ BRANDS = 'brands',
749
+ FORMFACTORS = 'formFactors',
750
+ FULLVERLIST = 'fullVersionList',
751
+ PLATFORM = 'platform',
752
+ PLATFORMVER = 'platformVersion',
753
+ BITNESS = 'bitness',
754
+ CH_HEADER = 'sec-ch-ua',
755
+ CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',
756
+ CH_HEADER_ARCH = CH_HEADER + '-arch',
757
+ CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,
758
+ CH_HEADER_FORM_FACTORS = CH_HEADER + '-form-factors',
759
+ CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,
760
+ CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,
761
+ CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
762
+ CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
763
+ CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],
764
+
765
+ // device vendors
766
+ AMAZON = 'Amazon',
767
+ APPLE = 'Apple',
768
+ ASUS = 'ASUS',
769
+ BLACKBERRY = 'BlackBerry',
770
+ GOOGLE = 'Google',
771
+ HUAWEI = 'Huawei',
772
+ LENOVO = 'Lenovo',
773
+ HONOR = 'Honor',
774
+ LG = 'LG',
775
+ MICROSOFT = 'Microsoft',
776
+ MOTOROLA = 'Motorola',
777
+ NVIDIA = 'Nvidia',
778
+ ONEPLUS = 'OnePlus',
779
+ OPPO = 'OPPO',
780
+ SAMSUNG = 'Samsung',
781
+ SHARP = 'Sharp',
782
+ SONY = 'Sony',
783
+ XIAOMI = 'Xiaomi',
784
+ ZEBRA = 'Zebra',
785
+
786
+ // browsers
787
+ CHROME = 'Chrome',
788
+ CHROMIUM = 'Chromium',
789
+ CHROMECAST = 'Chromecast',
790
+ EDGE = 'Edge',
791
+ FIREFOX = 'Firefox',
792
+ OPERA = 'Opera',
793
+ FACEBOOK = 'Facebook',
794
+ SOGOU = 'Sogou',
795
+
796
+ PREFIX_MOBILE = 'Mobile ',
797
+ SUFFIX_BROWSER = ' Browser',
798
+
799
+ // os
800
+ WINDOWS = 'Windows';
801
+
802
+ var isWindow = typeof window !== UNDEF_TYPE,
803
+ NAVIGATOR = (isWindow && window.navigator) ?
804
+ window.navigator :
805
+ undefined,
806
+ NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
807
+ NAVIGATOR.userAgentData :
808
+ undefined;
809
+
810
+ ///////////
811
+ // Helper
812
+ //////////
813
+
814
+ var extend = function (defaultRgx, extensions) {
815
+ var mergedRgx = {};
816
+ var extraRgx = extensions;
817
+ if (!isExtensions(extensions)) {
818
+ extraRgx = {};
819
+ for (var i in extensions) {
820
+ for (var j in extensions[i]) {
821
+ extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
822
+ }
823
+ }
824
+ }
825
+ for (var k in defaultRgx) {
826
+ mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
827
+ }
828
+ return mergedRgx;
829
+ },
830
+ enumerize = function (arr) {
831
+ var enums = {};
832
+ for (var i=0; i<arr.length; i++) {
833
+ enums[arr[i].toUpperCase()] = arr[i];
834
+ }
835
+ return enums;
836
+ },
837
+ has = function (str1, str2) {
838
+ if (typeof str1 === OBJ_TYPE && str1.length > 0) {
839
+ for (var i in str1) {
840
+ if (lowerize(str2) == lowerize(str1[i])) return true;
841
+ }
842
+ return false;
843
+ }
844
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
845
+ },
846
+ isExtensions = function (obj, deep) {
847
+ for (var prop in obj) {
848
+ return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
849
+ }
850
+ },
851
+ isString = function (val) {
852
+ return typeof val === STR_TYPE;
853
+ },
854
+ itemListToArray = function (header) {
855
+ if (!header) return undefined;
856
+ var arr = [];
857
+ var tokens = strip(/\\?\"/g, header).split(',');
858
+ for (var i = 0; i < tokens.length; i++) {
859
+ if (tokens[i].indexOf(';') > -1) {
860
+ var token = trim(tokens[i]).split(';v=');
861
+ arr[i] = { brand : token[0], version : token[1] };
862
+ } else {
863
+ arr[i] = trim(tokens[i]);
864
+ }
865
+ }
866
+ return arr;
867
+ },
868
+ lowerize = function (str) {
869
+ return isString(str) ? str.toLowerCase() : str;
870
+ },
871
+ majorize = function (version) {
872
+ return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
873
+ },
874
+ setProps = function (arr) {
875
+ for (var i in arr) {
876
+ var propName = arr[i];
877
+ if (typeof propName == OBJ_TYPE && propName.length == 2) {
878
+ this[propName[0]] = propName[1];
879
+ } else {
880
+ this[propName] = undefined;
881
+ }
882
+ }
883
+ return this;
884
+ },
885
+ strip = function (pattern, str) {
886
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
887
+ },
888
+ stripQuotes = function (str) {
889
+ return strip(/\\?\"/g, str);
890
+ },
891
+ trim = function (str, len) {
892
+ if (isString(str)) {
893
+ str = strip(/^\s\s*/, str);
894
+ return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
895
+ }
896
+ };
897
+
898
+ ///////////////
899
+ // Map helper
900
+ //////////////
901
+
902
+ var rgxMapper = function (ua, arrays) {
903
+
904
+ if(!ua || !arrays) return;
905
+
906
+ var i = 0, j, k, p, q, matches, match;
907
+
908
+ // loop through all regexes maps
909
+ while (i < arrays.length && !matches) {
910
+
911
+ var regex = arrays[i], // even sequence (0,2,4,..)
912
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
913
+ j = k = 0;
914
+
915
+ // try matching uastring with regexes
916
+ while (j < regex.length && !matches) {
917
+
918
+ if (!regex[j]) { break; }
919
+ matches = regex[j++].exec(ua);
920
+
921
+ if (!!matches) {
922
+ for (p = 0; p < props.length; p++) {
923
+ match = matches[++k];
924
+ q = props[p];
925
+ // check if given property is actually array
926
+ if (typeof q === OBJ_TYPE && q.length > 0) {
927
+ if (q.length === 2) {
928
+ if (typeof q[1] == FUNC_TYPE) {
929
+ // assign modified match
930
+ this[q[0]] = q[1].call(this, match);
931
+ } else {
932
+ // assign given value, ignore regex match
933
+ this[q[0]] = q[1];
934
+ }
935
+ } else if (q.length >= 3) {
936
+ // Check whether q[1] FUNCTION or REGEX
937
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
938
+ if (q.length > 3) {
939
+ this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;
940
+ } else {
941
+ // call function (usually string mapper)
942
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
943
+ }
944
+ } else {
945
+ if (q.length == 3) {
946
+ // sanitize match using given regex
947
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
948
+ } else if (q.length == 4) {
949
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
950
+ } else if (q.length > 4) {
951
+ this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;
952
+ }
953
+ }
954
+ }
955
+ } else {
956
+ this[q] = match ? match : undefined;
957
+ }
958
+ }
959
+ }
960
+ }
961
+ i += 2;
962
+ }
963
+ },
964
+
965
+ strMapper = function (str, map) {
966
+
967
+ for (var i in map) {
968
+ // check if current value is array
969
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
970
+ for (var j = 0; j < map[i].length; j++) {
971
+ if (has(map[i][j], str)) {
972
+ return (i === UNKNOWN) ? undefined : i;
973
+ }
974
+ }
975
+ } else if (has(map[i], str)) {
976
+ return (i === UNKNOWN) ? undefined : i;
977
+ }
978
+ }
979
+ return map.hasOwnProperty('*') ? map['*'] : str;
980
+ };
981
+
982
+ ///////////////
983
+ // String map
984
+ //////////////
985
+
986
+ var windowsVersionMap = {
987
+ 'ME' : '4.90',
988
+ 'NT 3.51': '3.51',
989
+ 'NT 4.0': '4.0',
990
+ '2000' : ['5.0', '5.01'],
991
+ 'XP' : ['5.1', '5.2'],
992
+ 'Vista' : '6.0',
993
+ '7' : '6.1',
994
+ '8' : '6.2',
995
+ '8.1' : '6.3',
996
+ '10' : ['6.4', '10.0'],
997
+ 'NT' : ''
998
+ },
999
+
1000
+ formFactorsMap = {
1001
+ 'embedded' : 'Automotive',
1002
+ 'mobile' : 'Mobile',
1003
+ 'tablet' : ['Tablet', 'EInk'],
1004
+ 'smarttv' : 'TV',
1005
+ 'wearable' : 'Watch',
1006
+ 'xr' : ['VR', 'XR'],
1007
+ '?' : ['Desktop', 'Unknown'],
1008
+ '*' : undefined
1009
+ },
1010
+
1011
+ browserHintsMap = {
1012
+ 'Chrome' : 'Google Chrome',
1013
+ 'Edge' : 'Microsoft Edge',
1014
+ 'Edge WebView2' : 'Microsoft Edge WebView2',
1015
+ 'Chrome WebView': 'Android WebView',
1016
+ 'Chrome Headless':'HeadlessChrome',
1017
+ 'Huawei Browser': 'HuaweiBrowser',
1018
+ 'MIUI Browser' : 'Miui Browser',
1019
+ 'Opera Mobi' : 'OperaMobile',
1020
+ 'Yandex' : 'YaBrowser'
1021
+ };
1022
+
1023
+ //////////////
1024
+ // Regex map
1025
+ /////////////
1026
+
1027
+ var defaultRegexes = {
1028
+
1029
+ browser : [[
1030
+
1031
+ // Most common regardless engine
1032
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
1033
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
1034
+ /webview.+edge\/([\w\.]+)/i // Microsoft Edge
1035
+ ], [VERSION, [NAME, EDGE+' WebView']], [
1036
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
1037
+ ], [VERSION, [NAME, 'Edge']], [
1038
+
1039
+ // Presto based
1040
+ /(opera mini)\/([-\w\.]+)/i, // Opera Mini
1041
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
1042
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
1043
+ ], [NAME, VERSION], [
1044
+ /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
1045
+ ], [VERSION, [NAME, OPERA+' Mini']], [
1046
+ /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
1047
+ ], [VERSION, [NAME, OPERA+' GX']], [
1048
+ /\bopr\/([\w\.]+)/i // Opera Webkit
1049
+ ], [VERSION, [NAME, OPERA]], [
1050
+
1051
+ // Mixed
1052
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
1053
+ ], [VERSION, [NAME, 'Baidu']], [
1054
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
1055
+ ], [VERSION, [NAME, 'Maxthon']], [
1056
+ /(kindle)\/([\w\.]+)/i, // Kindle
1057
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
1058
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
1059
+ // Trident based
1060
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
1061
+ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
1062
+
1063
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble
1064
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser)\/([-\w\.]+)/i,
1065
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
1066
+ /(heytap|ovi|115|surf)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
1067
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
1068
+ ], [NAME, VERSION], [
1069
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
1070
+ ], [VERSION, [NAME, 'Quark']], [
1071
+ /\bddg\/([\w\.]+)/i // DuckDuckGo
1072
+ ], [VERSION, [NAME, 'DuckDuckGo']], [
1073
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
1074
+ ], [VERSION, [NAME, 'UCBrowser']], [
1075
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
1076
+ /\bqbcore\/([\w\.]+).+microm/i,
1077
+ /micromessenger\/([\w\.]+)/i // WeChat
1078
+ ], [VERSION, [NAME, 'WeChat']], [
1079
+ /konqueror\/([\w\.]+)/i // Konqueror
1080
+ ], [VERSION, [NAME, 'Konqueror']], [
1081
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
1082
+ ], [VERSION, [NAME, 'IE']], [
1083
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
1084
+ ], [VERSION, [NAME, 'Yandex']], [
1085
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
1086
+ ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
1087
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
1088
+ ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
1089
+ /\bfocus\/([\w\.]+)/i // Firefox Focus
1090
+ ], [VERSION, [NAME, FIREFOX+' Focus']], [
1091
+ /\bopt\/([\w\.]+)/i // Opera Touch
1092
+ ], [VERSION, [NAME, OPERA+' Touch']], [
1093
+ /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
1094
+ ], [VERSION, [NAME, 'Coc Coc']], [
1095
+ /dolfin\/([\w\.]+)/i // Dolphin
1096
+ ], [VERSION, [NAME, 'Dolphin']], [
1097
+ /coast\/([\w\.]+)/i // Opera Coast
1098
+ ], [VERSION, [NAME, OPERA+' Coast']], [
1099
+ /miuibrowser\/([\w\.]+)/i // MIUI Browser
1100
+ ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
1101
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
1102
+ ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
1103
+ /\bqihoobrowser\/?([\w\.]*)/i // 360
1104
+ ], [VERSION, [NAME, '360']], [
1105
+ /\b(qq)\/([\w\.]+)/i // QQ
1106
+ ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
1107
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
1108
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
1109
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
1110
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
1111
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
1112
+ ], [VERSION, [NAME, SOGOU + ' Explorer']], [
1113
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
1114
+ ], [[NAME, SOGOU + ' Mobile'], VERSION], [
1115
+ /(electron)\/([\w\.]+) safari/i, // Electron-based App
1116
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
1117
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
1118
+ ], [NAME, VERSION], [
1119
+ /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq
1120
+ ], [NAME], [
1121
+ /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
1122
+ /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
1123
+ ], [VERSION, NAME], [
1124
+
1125
+ // WebView
1126
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
1127
+ ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [
1128
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
1129
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
1130
+ /(daum)apps[\/ ]([\w\.]+)/i, // Daum App
1131
+ /safari (line)\/([\w\.]+)/i, // Line App for iOS
1132
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
1133
+ /(alipay)client\/([\w\.]+)/i, // Alipay
1134
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
1135
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i // Instagram/Snapchat/Klarna
1136
+ ], [NAME, VERSION, [TYPE, INAPP]], [
1137
+ /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
1138
+ ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [
1139
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
1140
+ ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [
1141
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
1142
+ ], [NAME, [TYPE, INAPP]], [
1143
+
1144
+ /(chromium)[\/ ]([-\w\.]+)/i // Chromium
1145
+ ], [NAME, VERSION], [
1146
+
1147
+ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
1148
+ ], [VERSION, [NAME, CHROME+' Headless']], [
1149
+
1150
+ /wv\).+chrome\/([\w\.]+).+edgw\//i // Edge WebView2
1151
+ ], [VERSION, [NAME, EDGE+' WebView2']], [
1152
+
1153
+ / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
1154
+ ], [[NAME, CHROME+' WebView'], VERSION], [
1155
+
1156
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
1157
+ ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [
1158
+
1159
+ /chrome\/([\w\.]+) mobile/i // Chrome Mobile
1160
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [
1161
+
1162
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
1163
+ ], [NAME, VERSION], [
1164
+
1165
+ /version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i // Safari Mobile
1166
+ ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [
1167
+ /iphone .*mobile(?:\/\w+ | ?)safari/i
1168
+ ], [[NAME, PREFIX_MOBILE + 'Safari']], [
1169
+ /version\/([\w\.\,]+) .*(safari)/i // Safari
1170
+ ], [VERSION, NAME], [
1171
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
1172
+ ], [NAME, [VERSION, '1']], [
1173
+
1174
+ /(webkit|khtml)\/([\w\.]+)/i
1175
+ ], [NAME, VERSION], [
1176
+
1177
+ // Gecko based
1178
+ /(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i // Firefox Mobile
1179
+ ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [
1180
+ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
1181
+ ], [[NAME, 'Netscape'], VERSION], [
1182
+ /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
1183
+ ], [NAME, VERSION], [
1184
+ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
1185
+ ], [VERSION, [NAME, FIREFOX+' Reality']], [
1186
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
1187
+ /(swiftfox)/i, // Swiftfox
1188
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
1189
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
1190
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
1191
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
1192
+ /(firefox)\/([\w\.]+)/i, // Other Firefox-based
1193
+ /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
1194
+
1195
+ // Other
1196
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
1197
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
1198
+ /\b(links) \(([\w\.]+)/i // Links
1199
+ ], [NAME, [VERSION, /_/g, '.']], [
1200
+
1201
+ /(cobalt)\/([\w\.]+)/i // Cobalt
1202
+ ], [NAME, [VERSION, /[^\d\.]+./, EMPTY]]
1203
+ ],
1204
+
1205
+ cpu : [[
1206
+
1207
+ /\b((amd|x|x86[-_]?|wow|win)64)\b/i // AMD64 (x64)
1208
+ ], [[ARCHITECTURE, 'amd64']], [
1209
+
1210
+ /(ia32(?=;))/i, // IA32 (quicktime)
1211
+ /\b((i[346]|x)86)(pc)?\b/i // IA32 (x86)
1212
+ ], [[ARCHITECTURE, 'ia32']], [
1213
+
1214
+ /\b(aarch64|arm(v?[89]e?l?|_?64))\b/i // ARM64
1215
+ ], [[ARCHITECTURE, 'arm64']], [
1216
+
1217
+ /\b(arm(v[67])?ht?n?[fl]p?)\b/i // ARMHF
1218
+ ], [[ARCHITECTURE, 'armhf']], [
1219
+
1220
+ // PocketPC mistakenly identified as PowerPC
1221
+ /( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
1222
+ ], [[ARCHITECTURE, 'arm']], [
1223
+
1224
+ /((ppc|powerpc)(64)?)( mac|;|\))/i // PowerPC
1225
+ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
1226
+
1227
+ / sun4\w[;\)]/i // SPARC
1228
+ ], [[ARCHITECTURE, 'sparc']], [
1229
+
1230
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i
1231
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
1232
+ ], [[ARCHITECTURE, lowerize]]
1233
+ ],
1234
+
1235
+ device : [[
1236
+
1237
+ //////////////////////////
1238
+ // MOBILES & TABLETS
1239
+ /////////////////////////
1240
+
1241
+ // Samsung
1242
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
1243
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
1244
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
1245
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
1246
+ /sec-(sgh\w+)/i
1247
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
1248
+
1249
+ // Apple
1250
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
1251
+ ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
1252
+ /\((ipad);[-\w\),; ]+apple/i, // iPad
1253
+ /applecoremedia\/[\w\.]+ \((ipad)/i,
1254
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
1255
+ ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
1256
+ /(macintosh);/i
1257
+ ], [MODEL, [VENDOR, APPLE]], [
1258
+
1259
+ // Sharp
1260
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
1261
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
1262
+
1263
+ // Honor
1264
+ /\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
1265
+ ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [
1266
+ /honor([-\w ]+)[;\)]/i
1267
+ ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [
1268
+
1269
+ // Huawei
1270
+ /\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
1271
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
1272
+ /(?:huawei)([-\w ]+)[;\)]/i,
1273
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
1274
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
1275
+
1276
+ // Xiaomi
1277
+ /oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
1278
+ /\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i // Mi Pad tablets
1279
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
1280
+
1281
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
1282
+ /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
1283
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
1284
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
1285
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
1286
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i, // Xiaomi Mi
1287
+ / ([\w ]+) miui\/v?\d/i
1288
+ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
1289
+
1290
+ // OnePlus
1291
+ /droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,
1292
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
1293
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [
1294
+
1295
+ // OPPO
1296
+ /; (\w+) bui.+ oppo/i,
1297
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
1298
+ ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [
1299
+ /\b(opd2(\d{3}a?))(?: bui|\))/i
1300
+ ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [
1301
+
1302
+ // BLU
1303
+ /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i // Vivo series
1304
+ ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
1305
+
1306
+ // Vivo
1307
+ /; vivo (\w+)(?: bui|\))/i,
1308
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
1309
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
1310
+
1311
+ // Realme
1312
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
1313
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
1314
+
1315
+ // Lenovo
1316
+ /(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
1317
+ /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
1318
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
1319
+ /lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
1320
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [
1321
+
1322
+ // Motorola
1323
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
1324
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
1325
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
1326
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
1327
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
1328
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
1329
+
1330
+ // LG
1331
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
1332
+ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
1333
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
1334
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
1335
+ /\blg-?([\d\w]+) bui/i
1336
+ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
1337
+
1338
+ // Nokia
1339
+ /(nokia) (t[12][01])/i
1340
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
1341
+ /(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
1342
+ /nokia[-_ ]?(([-\w\. ]*))/i
1343
+ ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [
1344
+
1345
+ // Google
1346
+ /(pixel (c|tablet))\b/i // Google Pixel C/Tablet
1347
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
1348
+ // Google Pixel
1349
+ /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
1350
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
1351
+ /(google) (pixelbook( go)?)/i
1352
+ ], [VENDOR, MODEL], [
1353
+
1354
+ // Sony
1355
+ /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
1356
+ ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
1357
+ /sony tablet [ps]/i,
1358
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
1359
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
1360
+
1361
+ // Amazon
1362
+ /(alexa)webm/i,
1363
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
1364
+ /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
1365
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
1366
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
1367
+ ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
1368
+
1369
+ // BlackBerry
1370
+ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
1371
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
1372
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
1373
+ /\(bb10; (\w+)/i // BlackBerry 10
1374
+ ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
1375
+
1376
+ // Asus
1377
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
1378
+ ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
1379
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
1380
+ ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
1381
+
1382
+ // HTC
1383
+ /(nexus 9)/i // HTC Nexus 9
1384
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
1385
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
1386
+
1387
+ // ZTE
1388
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
1389
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
1390
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
1391
+
1392
+ // TCL
1393
+ /tcl (xess p17aa)/i,
1394
+ /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
1395
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
1396
+ /droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
1397
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [
1398
+
1399
+ // itel
1400
+ /(itel) ((\w+))/i
1401
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
1402
+
1403
+ // Acer
1404
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
1405
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
1406
+
1407
+ // Meizu
1408
+ /droid.+; (m[1-5] note) bui/i,
1409
+ /\bmz-([-\w]{2,})/i
1410
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
1411
+
1412
+ // Ulefone
1413
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
1414
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
1415
+
1416
+ // Energizer
1417
+ /; (energy ?\w+)(?: bui|\))/i,
1418
+ /; energizer ([\w ]+)(?: bui|\))/i
1419
+ ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
1420
+
1421
+ // Cat
1422
+ /; cat (b35);/i,
1423
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
1424
+ ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
1425
+
1426
+ // Smartfren
1427
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
1428
+ ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
1429
+
1430
+ // Nothing
1431
+ /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
1432
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
1433
+
1434
+ // Archos
1435
+ /; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
1436
+ /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
1437
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
1438
+ /archos ([\w ]+)( b|\))/i,
1439
+ /; (ac[3-6]\d\w{2,8})( b|\))/i
1440
+ ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
1441
+
1442
+ // HMD
1443
+ /; (n159v)/i
1444
+ ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [
1445
+
1446
+ // MIXED
1447
+ /(imo) (tab \w+)/i, // IMO
1448
+ /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno
1449
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
1450
+
1451
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
1452
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
1453
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i, // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL
1454
+ /(hp) ([\w ]+\w)/i, // HP iPAQ
1455
+ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
1456
+ /(oppo) ?([\w ]+) bui/i // OPPO
1457
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
1458
+
1459
+ /(kobo)\s(ereader|touch)/i, // Kobo
1460
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
1461
+ /(kindle)\/([\w\.]+)/i // Kindle
1462
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
1463
+
1464
+ /(surface duo)/i // Surface Duo
1465
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
1466
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
1467
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
1468
+ /((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i // Nvidia Tablets
1469
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [
1470
+ /(sprint) (\w+)/i // Sprint Phones
1471
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
1472
+ /(kin\.[onetw]{3})/i // Microsoft Kin
1473
+ ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
1474
+ /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
1475
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
1476
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
1477
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
1478
+
1479
+ ///////////////////
1480
+ // SMARTTVS
1481
+ ///////////////////
1482
+
1483
+ /smart-tv.+(samsung)/i // Samsung
1484
+ ], [VENDOR, [TYPE, SMARTTV]], [
1485
+ /hbbtv.+maple;(\d+)/i
1486
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
1487
+ /(vizio)(?: |.+model\/)(\w+-\w+)/i, // Vizio
1488
+ /tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
1489
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
1490
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
1491
+ ], [[VENDOR, LG], [TYPE, SMARTTV]], [
1492
+ /(apple) ?tv/i // Apple TV
1493
+ ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
1494
+ /crkey.*devicetype\/chromecast/i // Google Chromecast Third Generation
1495
+ ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
1496
+ /crkey.*devicetype\/([^/]*)/i // Google Chromecast with specific device type
1497
+ ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
1498
+ /fuchsia.*crkey/i // Google Chromecast Nest Hub
1499
+ ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
1500
+ /crkey/i // Google Chromecast, Linux-based or unknown
1501
+ ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
1502
+ /(portaltv)/i // Facebook Portal TV
1503
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
1504
+ /droid.+aft(\w+)( bui|\))/i // Fire TV
1505
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
1506
+ /(shield \w+ tv)/i // Nvidia Shield TV
1507
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [
1508
+ /\(dtv[\);].+(aquos)/i,
1509
+ /(aquos-tv[\w ]+)\)/i // Sharp
1510
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
1511
+ /(bravia[\w ]+)( bui|\))/i // Sony
1512
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
1513
+ /(mi(tv|box)-?\w+) bui/i // Xiaomi
1514
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
1515
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
1516
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
1517
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
1518
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
1519
+ ], [[VENDOR, /.+\/(\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [
1520
+ // SmartTV from Unidentified Vendors
1521
+ /droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i
1522
+ ], [MODEL, [TYPE, SMARTTV]], [
1523
+ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:|large screen[\w ]+safari)\b/i
1524
+ ], [[TYPE, SMARTTV]], [
1525
+
1526
+ ///////////////////
1527
+ // CONSOLES
1528
+ ///////////////////
1529
+
1530
+ /(playstation \w+)/i // Playstation
1531
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
1532
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
1533
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
1534
+ /(ouya)/i, // Ouya
1535
+ /(nintendo) (\w+)/i, // Nintendo
1536
+ /(retroid) (pocket ([^\)]+))/i // Retroid Pocket
1537
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
1538
+ /droid.+; (shield)( bui|\))/i // Nvidia Portable
1539
+ ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [
1540
+
1541
+ ///////////////////
1542
+ // WEARABLES
1543
+ ///////////////////
1544
+
1545
+ /\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i // Samsung Galaxy Watch
1546
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
1547
+ /((pebble))app/i, // Pebble
1548
+ /(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i // Asus ZenWatch / LG Watch / Pixel Watch
1549
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
1550
+ /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch
1551
+ ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [
1552
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
1553
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
1554
+ /(opwwe\d{3})/i // OnePlus Watch
1555
+ ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [
1556
+ /(moto 360)/i // Motorola 360
1557
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [
1558
+ /(smartwatch 3)/i // Sony SmartWatch
1559
+ ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [
1560
+ /(g watch r)/i // LG G Watch R
1561
+ ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [
1562
+ /droid.+; (wt63?0{2,3})\)/i
1563
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
1564
+
1565
+ ///////////////////
1566
+ // XR
1567
+ ///////////////////
1568
+
1569
+ /droid.+; (glass) \d/i // Google Glass
1570
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
1571
+ /(pico) (4|neo3(?: link|pro)?)/i // Pico
1572
+ ], [VENDOR, MODEL, [TYPE, XR]], [
1573
+ /(quest( \d| pro)?s?).+vr/i // Meta Quest
1574
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
1575
+ /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic
1576
+ ], [[TYPE, XR]], [
1577
+
1578
+ ///////////////////
1579
+ // EMBEDDED
1580
+ ///////////////////
1581
+
1582
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
1583
+ ], [VENDOR, [TYPE, EMBEDDED]], [
1584
+ /(aeobc)\b/i // Echo Dot
1585
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
1586
+ /(homepod).+mac os/i // Apple HomePod
1587
+ ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [
1588
+ /windows iot/i // Unidentifiable embedded device using Windows IoT
1589
+ ], [[TYPE, EMBEDDED]], [
1590
+
1591
+ ////////////////////
1592
+ // MIXED (GENERIC)
1593
+ ///////////////////
1594
+
1595
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i
1596
+ ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [
1597
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
1598
+ ], [[TYPE, TABLET]], [
1599
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
1600
+ ], [[TYPE, MOBILE]], [
1601
+ /droid .+?; ([\w\. -]+)( bui|\))/i // Generic Android Device
1602
+ ], [MODEL, [VENDOR, 'Generic']]
1603
+ ],
1604
+
1605
+ engine : [[
1606
+
1607
+ /windows.+ edge\/([\w\.]+)/i // EdgeHTML
1608
+ ], [VERSION, [NAME, EDGE+'HTML']], [
1609
+
1610
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
1611
+ ], [NAME, VERSION], [
1612
+
1613
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
1614
+ ], [VERSION, [NAME, 'Blink']], [
1615
+
1616
+ /(presto)\/([\w\.]+)/i, // Presto
1617
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
1618
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
1619
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
1620
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
1621
+
1622
+ /\b(libweb)/i // LibWeb
1623
+ ], [NAME, VERSION], [
1624
+ /ladybird\//i
1625
+ ], [[NAME, 'LibWeb']], [
1626
+
1627
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
1628
+ ], [VERSION, NAME]
1629
+ ],
1630
+
1631
+ os : [[
1632
+
1633
+ // Windows
1634
+ /(windows nt) (6\.[23]); arm/i // Windows RT
1635
+ ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [
1636
+ /(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, // Windows IoT/Mobile/Phone
1637
+ // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
1638
+ /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
1639
+ ], [NAME, VERSION], [
1640
+ /windows nt ?([\d\.\)]*)(?!.+xbox)/i,
1641
+ /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
1642
+ ], [[VERSION, /(;|\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [
1643
+ /(windows ce)\/?([\d\.]*)/i // Windows CE
1644
+ ], [NAME, VERSION], [
1645
+
1646
+ // iOS/macOS
1647
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
1648
+ /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
1649
+ /cfnetwork\/.+darwin/i
1650
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
1651
+ /(mac os x) ?([\w\. ]*)/i,
1652
+ /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i // Mac OS
1653
+ ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [
1654
+
1655
+ // Google Chromecast
1656
+ /android ([\d\.]+).*crkey/i // Google Chromecast, Android-based
1657
+ ], [VERSION, [NAME, CHROMECAST + ' Android']], [
1658
+ /fuchsia.*crkey\/([\d\.]+)/i // Google Chromecast, Fuchsia-based
1659
+ ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [
1660
+ /crkey\/([\d\.]+).*devicetype\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker
1661
+ ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [
1662
+ /linux.*crkey\/([\d\.]+)/i // Google Chromecast, Legacy Linux-based
1663
+ ], [VERSION, [NAME, CHROMECAST + ' Linux']], [
1664
+ /crkey\/([\d\.]+)/i // Google Chromecast, unknown
1665
+ ], [VERSION, [NAME, CHROMECAST]], [
1666
+
1667
+ // Mobile OSes
1668
+ /droid ([\w\.]+)\b.+(android[- ]x86)/i // Android-x86
1669
+ ], [VERSION, NAME], [
1670
+ /(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
1671
+ ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
1672
+ /(harmonyos)[\/ ]?([\d\.]*)/i, // HarmonyOS
1673
+ // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
1674
+ /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
1675
+ ], [NAME, VERSION], [
1676
+ /\(bb(10);/i // BlackBerry 10
1677
+ ], [VERSION, [NAME, BLACKBERRY]], [
1678
+ /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i // Symbian
1679
+ ], [VERSION, [NAME, 'Symbian']], [
1680
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
1681
+ ], [VERSION, [NAME, FIREFOX+' OS']], [
1682
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, // WebOS
1683
+ /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
1684
+ ], [VERSION, [NAME, 'webOS']], [
1685
+ /web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
1686
+ // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
1687
+ ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [
1688
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
1689
+ ], [VERSION, [NAME, 'watchOS']], [
1690
+
1691
+ // Google ChromeOS
1692
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
1693
+ ], [[NAME, "Chrome OS"], VERSION],[
1694
+
1695
+ // Smart TVs
1696
+ /panasonic;(viera)/i, // Panasonic Viera
1697
+ /(netrange)mmh/i, // Netrange
1698
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
1699
+
1700
+ // Console
1701
+ /(nintendo|playstation) (\w+)/i, // Nintendo/Playstation
1702
+ /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
1703
+ /(pico) .+os([\w\.]+)/i, // Pico
1704
+
1705
+ // Other
1706
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
1707
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i, // Mint
1708
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
1709
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
1710
+ // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
1711
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
1712
+ /\b(aix)[; ]([1-9\.]{0,4})/i, // AIX
1713
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i, // Hurd/Linux/MorphOS
1714
+ /(gnu) ?([\w\.]*)/i, // GNU
1715
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
1716
+ /(haiku) ?(r\d)?/i // Haiku
1717
+ ], [NAME, VERSION], [
1718
+ /(sunos) ?([\d\.]*)/i // Solaris
1719
+ ], [[NAME, 'Solaris'], VERSION], [
1720
+ /\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
1721
+ /(unix) ?([\w\.]*)/i // UNIX
1722
+ ], [NAME, VERSION]
1723
+ ]
1724
+ };
1725
+
1726
+ /////////////////
1727
+ // Factories
1728
+ ////////////////
1729
+
1730
+ var defaultProps = (function () {
1731
+ var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};
1732
+ setProps.call(props.init, [
1733
+ [UA_BROWSER, [NAME, VERSION, MAJOR, TYPE]],
1734
+ [UA_CPU, [ARCHITECTURE]],
1735
+ [UA_DEVICE, [TYPE, MODEL, VENDOR]],
1736
+ [UA_ENGINE, [NAME, VERSION]],
1737
+ [UA_OS, [NAME, VERSION]]
1738
+ ]);
1739
+ setProps.call(props.isIgnore, [
1740
+ [UA_BROWSER, [VERSION, MAJOR]],
1741
+ [UA_ENGINE, [VERSION]],
1742
+ [UA_OS, [VERSION]]
1743
+ ]);
1744
+ setProps.call(props.isIgnoreRgx, [
1745
+ [UA_BROWSER, / ?browser$/i],
1746
+ [UA_OS, / ?os$/i]
1747
+ ]);
1748
+ setProps.call(props.toString, [
1749
+ [UA_BROWSER, [NAME, VERSION]],
1750
+ [UA_CPU, [ARCHITECTURE]],
1751
+ [UA_DEVICE, [VENDOR, MODEL]],
1752
+ [UA_ENGINE, [NAME, VERSION]],
1753
+ [UA_OS, [NAME, VERSION]]
1754
+ ]);
1755
+ return props;
1756
+ })();
1757
+
1758
+ var createIData = function (item, itemType) {
1759
+
1760
+ var init_props = defaultProps.init[itemType],
1761
+ is_ignoreProps = defaultProps.isIgnore[itemType] || 0,
1762
+ is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,
1763
+ toString_props = defaultProps.toString[itemType] || 0;
1764
+
1765
+ function IData () {
1766
+ setProps.call(this, init_props);
1767
+ }
1768
+
1769
+ IData.prototype.getItem = function () {
1770
+ return item;
1771
+ };
1772
+
1773
+ IData.prototype.withClientHints = function () {
1774
+
1775
+ // nodejs / non-client-hints browsers
1776
+ if (!NAVIGATOR_UADATA) {
1777
+ return item
1778
+ .parseCH()
1779
+ .get();
1780
+ }
1781
+
1782
+ // browsers based on chromium 85+
1783
+ return NAVIGATOR_UADATA
1784
+ .getHighEntropyValues(CH_ALL_VALUES)
1785
+ .then(function (res) {
1786
+ return item
1787
+ .setCH(new UACHData(res, false))
1788
+ .parseCH()
1789
+ .get();
1790
+ });
1791
+ };
1792
+
1793
+ IData.prototype.withFeatureCheck = function () {
1794
+ return item.detectFeature().get();
1795
+ };
1796
+
1797
+ if (itemType != UA_RESULT) {
1798
+ IData.prototype.is = function (strToCheck) {
1799
+ var is = false;
1800
+ for (var i in this) {
1801
+ if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
1802
+ is = true;
1803
+ if (strToCheck != UNDEF_TYPE) break;
1804
+ } else if (strToCheck == UNDEF_TYPE && is) {
1805
+ is = !is;
1806
+ break;
1807
+ }
1808
+ }
1809
+ return is;
1810
+ };
1811
+ IData.prototype.toString = function () {
1812
+ var str = EMPTY;
1813
+ for (var i in toString_props) {
1814
+ if (typeof(this[toString_props[i]]) !== UNDEF_TYPE) {
1815
+ str += (str ? ' ' : EMPTY) + this[toString_props[i]];
1816
+ }
1817
+ }
1818
+ return str || UNDEF_TYPE;
1819
+ };
1820
+ }
1821
+
1822
+ if (!NAVIGATOR_UADATA) {
1823
+ IData.prototype.then = function (cb) {
1824
+ var that = this;
1825
+ var IDataResolve = function () {
1826
+ for (var prop in that) {
1827
+ if (that.hasOwnProperty(prop)) {
1828
+ this[prop] = that[prop];
1829
+ }
1830
+ }
1831
+ };
1832
+ IDataResolve.prototype = {
1833
+ is : IData.prototype.is,
1834
+ toString : IData.prototype.toString
1835
+ };
1836
+ var resolveData = new IDataResolve();
1837
+ cb(resolveData);
1838
+ return resolveData;
1839
+ };
1840
+ }
1841
+
1842
+ return new IData();
1843
+ };
1844
+
1845
+ /////////////////
1846
+ // Constructor
1847
+ ////////////////
1848
+
1849
+ function UACHData (uach, isHttpUACH) {
1850
+ uach = uach || {};
1851
+ setProps.call(this, CH_ALL_VALUES);
1852
+ if (isHttpUACH) {
1853
+ setProps.call(this, [
1854
+ [BRANDS, itemListToArray(uach[CH_HEADER])],
1855
+ [FULLVERLIST, itemListToArray(uach[CH_HEADER_FULL_VER_LIST])],
1856
+ [MOBILE, /\?1/.test(uach[CH_HEADER_MOBILE])],
1857
+ [MODEL, stripQuotes(uach[CH_HEADER_MODEL])],
1858
+ [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
1859
+ [PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],
1860
+ [ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],
1861
+ [FORMFACTORS, itemListToArray(uach[CH_HEADER_FORM_FACTORS])],
1862
+ [BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]
1863
+ ]);
1864
+ } else {
1865
+ for (var prop in uach) {
1866
+ if(this.hasOwnProperty(prop) && typeof uach[prop] !== UNDEF_TYPE) this[prop] = uach[prop];
1867
+ }
1868
+ }
1869
+ }
1870
+
1871
+ function UAItem (itemType, ua, rgxMap, uaCH) {
1872
+
1873
+ this.get = function (prop) {
1874
+ if (!prop) return this.data;
1875
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;
1876
+ };
1877
+
1878
+ this.set = function (prop, val) {
1879
+ this.data[prop] = val;
1880
+ return this;
1881
+ };
1882
+
1883
+ this.setCH = function (ch) {
1884
+ this.uaCH = ch;
1885
+ return this;
1886
+ };
1887
+
1888
+ this.detectFeature = function () {
1889
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
1890
+ switch (this.itemType) {
1891
+ case UA_BROWSER:
1892
+ // Brave-specific detection
1893
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == FUNC_TYPE) {
1894
+ this.set(NAME, 'Brave');
1895
+ }
1896
+ break;
1897
+ case UA_DEVICE:
1898
+ // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData
1899
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
1900
+ this.set(TYPE, MOBILE);
1901
+ }
1902
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
1903
+ if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== UNDEF_TYPE && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
1904
+ this.set(MODEL, 'iPad')
1905
+ .set(TYPE, TABLET);
1906
+ }
1907
+ break;
1908
+ case UA_OS:
1909
+ // Chrome-specific detection: check for 'platform' value of navigator.userAgentData
1910
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
1911
+ this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1912
+ }
1913
+ break;
1914
+ case UA_RESULT:
1915
+ var data = this.data;
1916
+ var detect = function (itemType) {
1917
+ return data[itemType]
1918
+ .getItem()
1919
+ .detectFeature()
1920
+ .get();
1921
+ };
1922
+ this.set(UA_BROWSER, detect(UA_BROWSER))
1923
+ .set(UA_CPU, detect(UA_CPU))
1924
+ .set(UA_DEVICE, detect(UA_DEVICE))
1925
+ .set(UA_ENGINE, detect(UA_ENGINE))
1926
+ .set(UA_OS, detect(UA_OS));
1927
+ }
1928
+ }
1929
+ return this;
1930
+ };
1931
+
1932
+ this.parseUA = function () {
1933
+ if (this.itemType != UA_RESULT) {
1934
+ rgxMapper.call(this.data, this.ua, this.rgxMap);
1935
+ }
1936
+ if (this.itemType == UA_BROWSER) {
1937
+ this.set(MAJOR, majorize(this.get(VERSION)));
1938
+ }
1939
+ return this;
1940
+ };
1941
+
1942
+ this.parseCH = function () {
1943
+ var uaCH = this.uaCH,
1944
+ rgxMap = this.rgxMap;
1945
+
1946
+ switch (this.itemType) {
1947
+ case UA_BROWSER:
1948
+ case UA_ENGINE:
1949
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1950
+ if (brands) {
1951
+ for (var i in brands) {
1952
+ var brandName = brands[i].brand || brands[i],
1953
+ brandVersion = brands[i].version;
1954
+ if (this.itemType == UA_BROWSER &&
1955
+ !/not.a.brand/i.test(brandName) &&
1956
+ (!prevName ||
1957
+ (/Chrom/.test(prevName) && brandName != CHROMIUM) ||
1958
+ (prevName == EDGE && /WebView2/.test(brandName))
1959
+ )) {
1960
+ brandName = strMapper(brandName, browserHintsMap);
1961
+ prevName = this.get(NAME);
1962
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
1963
+ this.set(NAME, brandName)
1964
+ .set(VERSION, brandVersion)
1965
+ .set(MAJOR, majorize(brandVersion));
1966
+ }
1967
+ prevName = brandName;
1968
+ }
1969
+ if (this.itemType == UA_ENGINE && brandName == CHROMIUM) {
1970
+ this.set(VERSION, brandVersion);
1971
+ }
1972
+ }
1973
+ }
1974
+ break;
1975
+ case UA_CPU:
1976
+ var archName = uaCH[ARCHITECTURE];
1977
+ if (archName) {
1978
+ if (archName && uaCH[BITNESS] == '64') archName += '64';
1979
+ rgxMapper.call(this.data, archName + ';', rgxMap);
1980
+ }
1981
+ break;
1982
+ case UA_DEVICE:
1983
+ if (uaCH[MOBILE]) {
1984
+ this.set(TYPE, MOBILE);
1985
+ }
1986
+ if (uaCH[MODEL]) {
1987
+ this.set(MODEL, uaCH[MODEL]);
1988
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
1989
+ var reParse = {};
1990
+ rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);
1991
+ if (!this.get(TYPE) && !!reParse.type) {
1992
+ this.set(TYPE, reParse.type);
1993
+ }
1994
+ if (!this.get(VENDOR) && !!reParse.vendor) {
1995
+ this.set(VENDOR, reParse.vendor);
1996
+ }
1997
+ }
1998
+ }
1999
+ if (uaCH[FORMFACTORS]) {
2000
+ var ff;
2001
+ if (typeof uaCH[FORMFACTORS] !== 'string') {
2002
+ var idx = 0;
2003
+ while (!ff && idx < uaCH[FORMFACTORS].length) {
2004
+ ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
2005
+ }
2006
+ } else {
2007
+ ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
2008
+ }
2009
+ this.set(TYPE, ff);
2010
+ }
2011
+ break;
2012
+ case UA_OS:
2013
+ var osName = uaCH[PLATFORM];
2014
+ if(osName) {
2015
+ var osVersion = uaCH[PLATFORMVER];
2016
+ if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');
2017
+ this.set(NAME, osName)
2018
+ .set(VERSION, osVersion);
2019
+ }
2020
+ // Xbox-Specific Detection
2021
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
2022
+ this.set(NAME, 'Xbox')
2023
+ .set(VERSION, undefined);
2024
+ }
2025
+ break;
2026
+ case UA_RESULT:
2027
+ var data = this.data;
2028
+ var parse = function (itemType) {
2029
+ return data[itemType]
2030
+ .getItem()
2031
+ .setCH(uaCH)
2032
+ .parseCH()
2033
+ .get();
2034
+ };
2035
+ this.set(UA_BROWSER, parse(UA_BROWSER))
2036
+ .set(UA_CPU, parse(UA_CPU))
2037
+ .set(UA_DEVICE, parse(UA_DEVICE))
2038
+ .set(UA_ENGINE, parse(UA_ENGINE))
2039
+ .set(UA_OS, parse(UA_OS));
2040
+ }
2041
+ return this;
2042
+ };
2043
+
2044
+ setProps.call(this, [
2045
+ ['itemType', itemType],
2046
+ ['ua', ua],
2047
+ ['uaCH', uaCH],
2048
+ ['rgxMap', rgxMap],
2049
+ ['data', createIData(this, itemType)]
2050
+ ]);
2051
+
2052
+ return this;
2053
+ }
2054
+
2055
+ function UAParser (ua, extensions, headers) {
2056
+
2057
+ if (typeof ua === OBJ_TYPE) {
2058
+ if (isExtensions(ua, true)) {
2059
+ if (typeof extensions === OBJ_TYPE) {
2060
+ headers = extensions; // case UAParser(extensions, headers)
2061
+ }
2062
+ extensions = ua; // case UAParser(extensions)
2063
+ } else {
2064
+ headers = ua; // case UAParser(headers)
2065
+ extensions = undefined;
2066
+ }
2067
+ ua = undefined;
2068
+ } else if (typeof ua === STR_TYPE && !isExtensions(extensions, true)) {
2069
+ headers = extensions; // case UAParser(ua, headers)
2070
+ extensions = undefined;
2071
+ }
2072
+
2073
+ // Convert Headers object into a plain object
2074
+ if (headers && typeof headers.append === FUNC_TYPE) {
2075
+ var kv = {};
2076
+ headers.forEach(function (v, k) { kv[k] = v; });
2077
+ headers = kv;
2078
+ }
2079
+
2080
+ if (!(this instanceof UAParser)) {
2081
+ return new UAParser(ua, extensions, headers).getResult();
2082
+ }
2083
+
2084
+ var userAgent = typeof ua === STR_TYPE ? ua : // Passed user-agent string
2085
+ (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers
2086
+ ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent
2087
+ EMPTY)), // empty string
2088
+
2089
+ httpUACH = new UACHData(headers, true),
2090
+ regexMap = extensions ?
2091
+ extend(defaultRegexes, extensions) :
2092
+ defaultRegexes,
2093
+
2094
+ createItemFunc = function (itemType) {
2095
+ if (itemType == UA_RESULT) {
2096
+ return function () {
2097
+ return new UAItem(itemType, userAgent, regexMap, httpUACH)
2098
+ .set('ua', userAgent)
2099
+ .set(UA_BROWSER, this.getBrowser())
2100
+ .set(UA_CPU, this.getCPU())
2101
+ .set(UA_DEVICE, this.getDevice())
2102
+ .set(UA_ENGINE, this.getEngine())
2103
+ .set(UA_OS, this.getOS())
2104
+ .get();
2105
+ };
2106
+ } else {
2107
+ return function () {
2108
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)
2109
+ .parseUA()
2110
+ .get();
2111
+ };
2112
+ }
2113
+ };
2114
+
2115
+ // public methods
2116
+ setProps.call(this, [
2117
+ ['getBrowser', createItemFunc(UA_BROWSER)],
2118
+ ['getCPU', createItemFunc(UA_CPU)],
2119
+ ['getDevice', createItemFunc(UA_DEVICE)],
2120
+ ['getEngine', createItemFunc(UA_ENGINE)],
2121
+ ['getOS', createItemFunc(UA_OS)],
2122
+ ['getResult', createItemFunc(UA_RESULT)],
2123
+ ['getUA', function () { return userAgent; }],
2124
+ ['setUA', function (ua) {
2125
+ if (isString(ua))
2126
+ userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
2127
+ return this;
2128
+ }]
2129
+ ])
2130
+ .setUA(userAgent);
2131
+
2132
+ return this;
2133
+ }
2134
+
2135
+ UAParser.VERSION = LIBVERSION;
2136
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);
2137
+ UAParser.CPU = enumerize([ARCHITECTURE]);
2138
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
2139
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
2140
+
2141
+ const MobileContext = createContext(undefined);
2142
+ const detectMobile = (userAgent) => {
2143
+ const parser = new UAParser();
2144
+ parser.setUA(userAgent);
2145
+ const device = parser.getDevice();
2146
+ // Consider mobile and tablet devices as mobile
2147
+ return device.type === 'mobile' || device.type === 'tablet';
2148
+ };
2149
+ const MobileProvider = ({ userAgent, children, }) => {
2150
+ const isMobile = detectMobile(userAgent);
2151
+ const value = useMemo(() => ({
2152
+ isMobile,
2153
+ userAgent,
2154
+ }), [isMobile, userAgent]);
2155
+ return (jsxRuntimeExports.jsx(MobileContext.Provider, { value: value, children: children }));
2156
+ };
2157
+ const useMobile = (isMobile) => {
2158
+ // const context = useContext(MobileContext);
2159
+ // if (context === undefined) {
2160
+ // throw new Error('useMobile must be used within a MobileProvider');
2161
+ // }
2162
+ const context = {
2163
+ isMobile: isMobile || false,
2164
+ userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
2165
+ };
2166
+ return context;
2167
+ };
2168
+
2169
+ const Input$1 = React.forwardRef(({ state = 'default', label, value, onChange, helperText, startIcon, endIcon, type = 'text', ...props }, ref) => {
2170
+ const [isFocused, setIsFocused] = useState(false);
2171
+ const id = useId();
2172
+ const hasContent = value !== '' && value !== null && value !== undefined;
2173
+ const isLabelFloated = isFocused || hasContent;
2174
+ const isDisabled = state === 'disabled';
2175
+ const { isMobile } = useMobile();
2176
+ const handleFocus = (e) => {
2177
+ if (!isDisabled) {
2178
+ setIsFocused(true);
2179
+ props.onFocus?.(e);
2180
+ }
2181
+ };
2182
+ const handleBlur = (e) => {
2183
+ if (!isDisabled) {
2184
+ setIsFocused(false);
2185
+ props.onBlur?.(e);
2186
+ }
2187
+ };
2188
+ const baseContainerClasses = 'relative flex items-center border rounded-lg transition-all duration-300 w-[360px]';
2189
+ const baseLabelClasses = 'absolute pointer-events-none transition-all duration-300';
2190
+ const baseInputClasses = 'peer w-full h-full bg-transparent outline-none text-m font-medium disabled:text-neutral-light';
2191
+ const baseIconClasses = 'absolute h-5 w-5 transition-colors duration-300';
2192
+ const containerClasses = cn(baseContainerClasses, {
2193
+ 'h-[54px]': !isMobile,
2194
+ 'h-12': isMobile,
2195
+ 'border-neutral-light': state === 'default' && !isFocused,
2196
+ 'border-primary': state === 'default' && isFocused,
2197
+ 'border-error': state === 'error',
2198
+ 'bg-white border-neutral-light cursor-not-allowed': isDisabled,
2199
+ });
2200
+ const labelClasses = cn(baseLabelClasses, {
2201
+ 'top-[-10px] bg-white px-1 mx-3 font-medium': isLabelFloated,
2202
+ 'text-s': (!isMobile && isLabelFloated) || (isMobile && !isLabelFloated),
2203
+ 'text-xs': isMobile && isLabelFloated,
2204
+ 'text-m': !isMobile && !isLabelFloated,
2205
+ 'right-1': startIcon,
2206
+ 'right-3': !startIcon,
2207
+ 'top-1/2 -translate-y-1/2 text-m font-medium': !isLabelFloated,
2208
+ 'right-11': !isLabelFloated && startIcon,
2209
+ 'right-4': !isLabelFloated && !startIcon,
2210
+ 'text-neutral-main': !isFocused && state === 'default',
2211
+ 'text-neutral-light': isDisabled,
2212
+ 'text-primary': isFocused && state === 'default',
2213
+ 'text-error': isLabelFloated && state === 'error',
2214
+ });
2215
+ const inputClasses = cn(baseInputClasses, {
2216
+ 'pr-12': startIcon,
2217
+ 'pl-12': endIcon,
2218
+ 'px-4': !startIcon && !endIcon,
2219
+ 'pr-4 pl-12': !startIcon && endIcon,
2220
+ 'pl-4 pr-12': startIcon && !endIcon,
2221
+ 'cursor-not-allowed text-red-500': isDisabled,
2222
+ 'text-neutral-dark': !isFocused,
2223
+ 'text-neutral-darker': isFocused,
2224
+ });
2225
+ const iconClasses = cn(baseIconClasses, {
2226
+ 'text-neutral-main': state !== 'error' && !isFocused,
2227
+ 'text-primary': state === 'default' && isFocused,
2228
+ 'text-error': state === 'error',
2229
+ 'text-neutral-light': isDisabled,
2230
+ });
2231
+ const helperTextClasses = cn('font-light mt-1 px-2 h-4', {
2232
+ 'text-s': !isMobile,
2233
+ 'text-xs': isMobile,
2234
+ 'text-neutral-main': state === 'default',
2235
+ 'text-primary': state === 'default' && isFocused,
2236
+ 'text-error': state === 'error',
2237
+ 'text-neutral-light': isDisabled,
2238
+ });
2239
+ return (jsxRuntimeExports.jsxs("div", { children: [jsxRuntimeExports.jsxs("div", { className: containerClasses, children: [endIcon && (jsxRuntimeExports.jsx("span", { className: cn(iconClasses, 'left-4'), children: endIcon })), jsxRuntimeExports.jsx("label", { htmlFor: id, className: labelClasses, children: label }), jsxRuntimeExports.jsx("input", { ref: ref, id: id, type: type, value: value, onChange: onChange, onFocus: handleFocus, onBlur: handleBlur, disabled: isDisabled, className: inputClasses, ...props }), startIcon && (jsxRuntimeExports.jsx("span", { className: cn(iconClasses, 'right-4'), children: startIcon }))] }), helperText && jsxRuntimeExports.jsx("p", { className: helperTextClasses, children: helperText })] }));
2240
+ });
2241
+ Input$1.displayName = 'Input';
2242
+
2243
+ // Helper functions moved outside component
2244
+ const handleTabClick = (tabId, disabled, onTabChange) => {
2245
+ if (!disabled) {
2246
+ onTabChange(tabId);
2247
+ }
2248
+ };
2249
+ const handleKeyDown = (e, tabId, disabled, onTabChange) => {
2250
+ if ((e.key === 'Enter' || e.key === ' ') && !disabled) {
2251
+ e.preventDefault();
2252
+ onTabChange(tabId);
2253
+ }
2254
+ };
2255
+ const renderBadge = (count, isActive, disabled, isMobile) => {
2256
+ if (count === undefined)
2257
+ return null;
2258
+ return (jsxRuntimeExports.jsx("div", { className: cn('flex items-center justify-center rounded-[5px] font-sans font-bold text-white', 'transition-colors duration-200', isMobile
2259
+ ? 'size-6 text-[14px] pt-0.5'
2260
+ : 'size-[25px] text-[14px] pt-[3px]', disabled ? 'bg-midnight' : isActive ? 'bg-primary' : 'bg-neutral-main'), children: jsxRuntimeExports.jsx("p", { className: "leading-[24px] whitespace-pre", dir: "auto", children: count }) }));
2261
+ };
2262
+ const renderTabContent = (item, isActive, isMobile) => {
2263
+ const hasCount = item.count !== undefined;
2264
+ return (jsxRuntimeExports.jsxs("div", { className: cn('flex flex-row items-center justify-start transition-colors duration-200', isMobile ? 'gap-1.5' : 'gap-1.5'), children: [hasCount && renderBadge(item.count, isActive, item.disabled, isMobile), jsxRuntimeExports.jsx("div", { className: cn('font-sans text-nowrap text-right transition-colors duration-200', isMobile ? 'text-[14px]' : isActive ? 'text-[16px]' : 'text-[18px]', item.disabled
2265
+ ? 'font-normal text-midnight'
2266
+ : isActive
2267
+ ? 'font-bold text-primary'
2268
+ : 'font-normal text-neutral-main', isMobile
2269
+ ? 'leading-[24px]'
2270
+ : isActive
2271
+ ? 'leading-normal'
2272
+ : 'leading-[1.9]'), children: jsxRuntimeExports.jsx("p", { className: "whitespace-pre", dir: "auto", children: item.label }) })] }));
2273
+ };
2274
+ const renderTab = (item, activeTab, isMobile, onTabChange) => {
2275
+ const isActive = item.id === activeTab;
2276
+ return (jsxRuntimeExports.jsxs("div", { className: cn('box-border flex flex-col items-center justify-between relative shrink-0', 'cursor-pointer transition-all duration-200', isMobile ? 'h-12 px-3' : 'h-14 px-4', isActive
2277
+ ? isMobile
2278
+ ? 'pt-[11px] pb-0'
2279
+ : 'pt-3.5 pb-0'
2280
+ : 'py-0 justify-center', item.disabled && 'cursor-not-allowed opacity-50', !item.disabled && 'hover:opacity-80'), onClick: () => handleTabClick(item.id, item.disabled, onTabChange), onKeyDown: (e) => handleKeyDown(e, item.id, item.disabled, onTabChange), tabIndex: item.disabled ? -1 : 0, role: "tab", "aria-selected": isActive, "aria-disabled": item.disabled, children: [renderTabContent(item, isActive, isMobile), isActive && (jsxRuntimeExports.jsx("div", { className: "bg-primary h-1 rounded-tl-[8px] rounded-tr-[8px] shrink-0 w-full" }))] }, item.id));
2281
+ };
2282
+ const Tabs$1 = React.forwardRef(({ items, activeTab, onTabChange, className, isMobile: isMobileProp, ...props }, ref) => {
2283
+ const { isMobile } = useMobile(isMobileProp);
2284
+ return (jsxRuntimeExports.jsxs("div", { ref: ref, className: cn('relative w-full', className), ...props, children: [jsxRuntimeExports.jsx("div", { className: "box-border flex flex-row items-center justify-end p-0 relative w-full", children: items.map((item) => renderTab(item, activeTab, isMobile, onTabChange)) }), jsxRuntimeExports.jsx("div", { className: "absolute border-midnight-light border-[0px_0px_1px] border-solid bottom-[-0.5px] left-0 right-0 top-0 pointer-events-none" })] }));
2285
+ });
2286
+ Tabs$1.displayName = 'Tabs';
2287
+
2288
+ const Drawer$1 = React.forwardRef(({ children, direction = 'bottom', fullScreen = false, isOpen = false, onClose, className, ...props }, ref) => {
2289
+ const overlayRef = useRef(null);
2290
+ const drawerRef = useRef(null);
2291
+ const { isMobile } = useMobile();
2292
+ // Handle escape key
2293
+ useEffect(() => {
2294
+ const handleEscape = (event) => {
2295
+ if (event.key === 'Escape' && isOpen && onClose) {
2296
+ onClose();
2297
+ }
2298
+ };
2299
+ if (isOpen) {
2300
+ document.addEventListener('keydown', handleEscape);
2301
+ // Prevent body scroll when drawer is open
2302
+ document.body.style.overflow = 'hidden';
2303
+ }
2304
+ return () => {
2305
+ document.removeEventListener('keydown', handleEscape);
2306
+ document.body.style.overflow = 'auto';
2307
+ };
2308
+ }, [isOpen, onClose]);
2309
+ // Handle click outside
2310
+ const handleOverlayClick = (event) => {
2311
+ if (!fullScreen &&
2312
+ onClose &&
2313
+ overlayRef.current &&
2314
+ event.target === overlayRef.current) {
2315
+ onClose();
2316
+ }
2317
+ };
2318
+ // Handle keyboard events on overlay
2319
+ const handleOverlayKeyDown = (event) => {
2320
+ if (event.key === 'Enter' || event.key === ' ') {
2321
+ if (!fullScreen &&
2322
+ onClose &&
2323
+ overlayRef.current &&
2324
+ event.target === overlayRef.current) {
2325
+ onClose();
2326
+ }
2327
+ }
2328
+ };
2329
+ const getTranslateClasses = () => {
2330
+ if (!isOpen) {
2331
+ switch (direction) {
2332
+ case 'top':
2333
+ return '-translate-y-full';
2334
+ case 'bottom':
2335
+ return 'translate-y-full';
2336
+ case 'left':
2337
+ return '-translate-x-full';
2338
+ case 'right':
2339
+ return 'translate-x-full';
2340
+ default:
2341
+ return 'translate-y-full';
2342
+ }
2343
+ }
2344
+ return 'translate-x-0 translate-y-0';
2345
+ };
2346
+ const getPositionClasses = () => {
2347
+ switch (direction) {
2348
+ case 'top':
2349
+ return 'top-0 left-0 right-0';
2350
+ case 'bottom':
2351
+ return 'bottom-0 left-0 right-0';
2352
+ case 'left':
2353
+ return 'top-0 left-0 bottom-0';
2354
+ case 'right':
2355
+ return 'top-0 right-0 bottom-0';
2356
+ default:
2357
+ return 'bottom-0 left-0 right-0';
2358
+ }
2359
+ };
2360
+ const getSizeClasses = () => {
2361
+ const isVertical = direction === 'top' || direction === 'bottom';
2362
+ if (fullScreen) {
2363
+ return isVertical ? 'w-full h-full' : 'w-full h-full';
2364
+ }
2365
+ if (isVertical) {
2366
+ return 'w-full max-h-[90vh]';
2367
+ }
2368
+ return 'h-full max-w-[90vw]';
2369
+ };
2370
+ const baseOverlayClasses = 'fixed inset-0 z-50 transition-all duration-300';
2371
+ const baseDrawerClasses = 'fixed bg-white shadow-2xl transition-all duration-300 ease-out overflow-auto';
2372
+ const overlayClasses = cn(baseOverlayClasses, {
2373
+ 'bg-neutral-darker/50 backdrop-blur-sm': isOpen,
2374
+ 'bg-transparent pointer-events-none': !isOpen,
2375
+ });
2376
+ const drawerClasses = cn(baseDrawerClasses, getPositionClasses(), getSizeClasses(), getTranslateClasses(), {
2377
+ 'rounded-t-2xl': direction === 'bottom' && !fullScreen,
2378
+ 'rounded-b-2xl': direction === 'top' && !fullScreen,
2379
+ 'rounded-r-2xl': direction === 'left' && !fullScreen,
2380
+ 'rounded-l-2xl': direction === 'right' && !fullScreen,
2381
+ 'p-6': !isMobile,
2382
+ 'p-4': isMobile,
2383
+ }, className);
2384
+ if (!isOpen) {
2385
+ return null;
2386
+ }
2387
+ return (jsxRuntimeExports.jsx("div", { ref: overlayRef, className: overlayClasses, onClick: handleOverlayClick, onKeyDown: handleOverlayKeyDown, tabIndex: -1, role: "button", "aria-label": "Close drawer", children: jsxRuntimeExports.jsx("div", { ref: ref || drawerRef, className: drawerClasses, role: "dialog", "aria-modal": "true", "aria-label": "Drawer", ...props, children: children }) }));
2388
+ });
2389
+ Drawer$1.displayName = 'Drawer';
2390
+
2391
+ const Backdrop$1 = React.forwardRef(({ isOpen = false, onClick, blur = false, zIndex = 51, className, children, ...props }, ref) => {
2392
+ const handleClick = (event) => {
2393
+ if (onClick && event.target === event.currentTarget) {
2394
+ onClick();
2395
+ }
2396
+ };
2397
+ const backdropClasses = cn('fixed inset-0 transition-all duration-300', {
2398
+ 'opacity-100 pointer-events-auto': isOpen,
2399
+ 'opacity-0 pointer-events-none': !isOpen,
2400
+ 'backdrop-blur-sm': blur,
2401
+ }, className);
2402
+ const backdropStyle = {
2403
+ backgroundColor: 'rgba(0, 0, 0, 0.60)',
2404
+ zIndex,
2405
+ };
2406
+ return (jsxRuntimeExports.jsx("div", { ref: ref, className: backdropClasses, style: backdropStyle, onClick: handleClick, role: "presentation", "aria-hidden": !isOpen, ...props, children: children }));
2407
+ });
2408
+ Backdrop$1.displayName = 'Backdrop';
2409
+
2410
+ /**
2411
+ * @license lucide-react v0.522.0 - ISC
2412
+ *
2413
+ * This source code is licensed under the ISC license.
2414
+ * See the LICENSE file in the root directory of this source tree.
2415
+ */
2416
+
2417
+ const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
2418
+ const toCamelCase = (string) => string.replace(
2419
+ /^([A-Z])|[\s-_]+(\w)/g,
2420
+ (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()
2421
+ );
2422
+ const toPascalCase = (string) => {
2423
+ const camelCase = toCamelCase(string);
2424
+ return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
2425
+ };
2426
+ const mergeClasses = (...classes) => classes.filter((className, index, array) => {
2427
+ return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
2428
+ }).join(" ").trim();
2429
+ const hasA11yProp = (props) => {
2430
+ for (const prop in props) {
2431
+ if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
2432
+ return true;
2433
+ }
2434
+ }
2435
+ };
2436
+
2437
+ /**
2438
+ * @license lucide-react v0.522.0 - ISC
2439
+ *
2440
+ * This source code is licensed under the ISC license.
2441
+ * See the LICENSE file in the root directory of this source tree.
2442
+ */
2443
+
2444
+ var defaultAttributes = {
2445
+ xmlns: "http://www.w3.org/2000/svg",
2446
+ width: 24,
2447
+ height: 24,
2448
+ viewBox: "0 0 24 24",
2449
+ fill: "none",
2450
+ stroke: "currentColor",
2451
+ strokeWidth: 2,
2452
+ strokeLinecap: "round",
2453
+ strokeLinejoin: "round"
2454
+ };
2455
+
2456
+ /**
2457
+ * @license lucide-react v0.522.0 - ISC
2458
+ *
2459
+ * This source code is licensed under the ISC license.
2460
+ * See the LICENSE file in the root directory of this source tree.
2461
+ */
2462
+
2463
+
2464
+ const Icon = forwardRef(
2465
+ ({
2466
+ color = "currentColor",
2467
+ size = 24,
2468
+ strokeWidth = 2,
2469
+ absoluteStrokeWidth,
2470
+ className = "",
2471
+ children,
2472
+ iconNode,
2473
+ ...rest
2474
+ }, ref) => createElement(
2475
+ "svg",
2476
+ {
2477
+ ref,
2478
+ ...defaultAttributes,
2479
+ width: size,
2480
+ height: size,
2481
+ stroke: color,
2482
+ strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,
2483
+ className: mergeClasses("lucide", className),
2484
+ ...!children && !hasA11yProp(rest) && { "aria-hidden": "true" },
2485
+ ...rest
2486
+ },
2487
+ [
2488
+ ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
2489
+ ...Array.isArray(children) ? children : [children]
2490
+ ]
2491
+ )
2492
+ );
2493
+
2494
+ /**
2495
+ * @license lucide-react v0.522.0 - ISC
2496
+ *
2497
+ * This source code is licensed under the ISC license.
2498
+ * See the LICENSE file in the root directory of this source tree.
2499
+ */
2500
+
2501
+
2502
+ const createLucideIcon = (iconName, iconNode) => {
2503
+ const Component = forwardRef(
2504
+ ({ className, ...props }, ref) => createElement(Icon, {
2505
+ ref,
2506
+ iconNode,
2507
+ className: mergeClasses(
2508
+ `lucide-${toKebabCase(toPascalCase(iconName))}`,
2509
+ `lucide-${iconName}`,
2510
+ className
2511
+ ),
2512
+ ...props
2513
+ })
2514
+ );
2515
+ Component.displayName = toPascalCase(iconName);
2516
+ return Component;
2517
+ };
2518
+
2519
+ /**
2520
+ * @license lucide-react v0.522.0 - ISC
2521
+ *
2522
+ * This source code is licensed under the ISC license.
2523
+ * See the LICENSE file in the root directory of this source tree.
2524
+ */
2525
+
2526
+
2527
+ const __iconNode$7 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
2528
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$7);
2529
+
2530
+ /**
2531
+ * @license lucide-react v0.522.0 - ISC
2532
+ *
2533
+ * This source code is licensed under the ISC license.
2534
+ * See the LICENSE file in the root directory of this source tree.
2535
+ */
2536
+
2537
+
2538
+ const __iconNode$6 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
2539
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$6);
2540
+
2541
+ /**
2542
+ * @license lucide-react v0.522.0 - ISC
2543
+ *
2544
+ * This source code is licensed under the ISC license.
2545
+ * See the LICENSE file in the root directory of this source tree.
2546
+ */
2547
+
2548
+
2549
+ const __iconNode$5 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
2550
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$5);
2551
+
2552
+ /**
2553
+ * @license lucide-react v0.522.0 - ISC
2554
+ *
2555
+ * This source code is licensed under the ISC license.
2556
+ * See the LICENSE file in the root directory of this source tree.
2557
+ */
2558
+
2559
+
2560
+ const __iconNode$4 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
2561
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$4);
2562
+
2563
+ /**
2564
+ * @license lucide-react v0.522.0 - ISC
2565
+ *
2566
+ * This source code is licensed under the ISC license.
2567
+ * See the LICENSE file in the root directory of this source tree.
2568
+ */
2569
+
2570
+
2571
+ const __iconNode$3 = [
2572
+ ["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
2573
+ ["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
2574
+ ];
2575
+ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$3);
2576
+
2577
+ /**
2578
+ * @license lucide-react v0.522.0 - ISC
2579
+ *
2580
+ * This source code is licensed under the ISC license.
2581
+ * See the LICENSE file in the root directory of this source tree.
2582
+ */
2583
+
2584
+
2585
+ const __iconNode$2 = [
2586
+ ["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
2587
+ ["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
2588
+ ];
2589
+ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$2);
2590
+
2591
+ /**
2592
+ * @license lucide-react v0.522.0 - ISC
2593
+ *
2594
+ * This source code is licensed under the ISC license.
2595
+ * See the LICENSE file in the root directory of this source tree.
2596
+ */
2597
+
2598
+
2599
+ const __iconNode$1 = [
2600
+ ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
2601
+ ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
2602
+ ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
2603
+ ];
2604
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1);
2605
+
2606
+ /**
2607
+ * @license lucide-react v0.522.0 - ISC
2608
+ *
2609
+ * This source code is licensed under the ISC license.
2610
+ * See the LICENSE file in the root directory of this source tree.
2611
+ */
2612
+
2613
+
2614
+ const __iconNode = [
2615
+ ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
2616
+ ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
2617
+ ];
2618
+ const X = createLucideIcon("x", __iconNode);
2619
+
2620
+ const Breadcrumb$1 = React.forwardRef(({ items, className, testIsMobile }, ref) => {
2621
+ const { isMobile } = useMobile(testIsMobile);
2622
+ const handleItemClick = (item, index, e) => {
2623
+ // Don't make the last item (current page) clickable
2624
+ if (index === items.length - 1)
2625
+ return;
2626
+ if (item.onClick) {
2627
+ e.preventDefault();
2628
+ item.onClick();
2629
+ }
2630
+ // If item has href, let the anchor tag handle navigation naturally
2631
+ };
2632
+ return (jsxRuntimeExports.jsx("nav", { ref: ref, className: cn(
2633
+ // Base layout - RTL with flex-row-reverse to show items right to left
2634
+ 'flex flex-row-reverse items-center',
2635
+ // Responsive gap and padding based on mobile state
2636
+ isMobile ? 'gap-1 px-4 py-2.5' : 'gap-3 pr-1 pt-3 pb-4 pl-0', className), "aria-label": "Breadcrumb navigation", children: jsxRuntimeExports.jsx("ol", { className: "flex flex-row-reverse items-center gap-inherit", children: items.map((item, index) => {
2637
+ const isLast = index === items.length - 1;
2638
+ const isClickable = !isLast && (item.href || item.onClick);
2639
+ const itemKey = `${item.label}-${index}`;
2640
+ return (jsxRuntimeExports.jsxs("li", { className: "flex items-center gap-inherit", children: [isClickable ? (jsxRuntimeExports.jsx("a", { href: item.href || '#', className: cn(
2641
+ // Base styles
2642
+ 'whitespace-nowrap border-0 bg-transparent p-0 no-underline',
2643
+ // Responsive font size based on mobile state
2644
+ isMobile ? 'text-t' : 'text-s',
2645
+ // Color
2646
+ 'text-neutral-main',
2647
+ // Cursor and hover effects for clickable items
2648
+ 'cursor-pointer hover:text-neutral-dark transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 rounded-sm'), onClick: (e) => handleItemClick(item, index, e), onKeyDown: (e) => {
2649
+ if (e.key === 'Enter' || e.key === ' ') {
2650
+ e.preventDefault();
2651
+ if (item.onClick) {
2652
+ item.onClick();
2653
+ }
2654
+ }
2655
+ }, "aria-label": `Go to ${item.label}`, children: item.label })) : (jsxRuntimeExports.jsx("span", { className: cn(
2656
+ // Base styles
2657
+ 'whitespace-nowrap',
2658
+ // Responsive font size based on mobile state
2659
+ isMobile ? 'text-t' : 'text-s',
2660
+ // Color
2661
+ 'text-neutral-main',
2662
+ // Different styles for current page (last item)
2663
+ 'font-medium'), "aria-current": isLast ? 'page' : undefined, "aria-label": isLast ? `Current page: ${item.label}` : undefined, children: item.label })), !isLast && (jsxRuntimeExports.jsx(ChevronLeft, { className: cn('text-black flex-shrink-0',
2664
+ // Responsive icon size
2665
+ isMobile ? 'w-2.5 h-2.5' : 'w-3 h-3'), "aria-hidden": "true" }))] }, itemKey));
2666
+ }) }) }));
2667
+ });
2668
+ Breadcrumb$1.displayName = 'Breadcrumb';
2669
+
2670
+ function PaginationRoot({ className, ...props }) {
2671
+ return (jsxRuntimeExports.jsx("nav", { role: "navigation", "aria-label": "pagination", "data-slot": "pagination", className: cn('mx-auto flex w-full justify-center', className), ...props }));
2672
+ }
2673
+ function PaginationContent({ className, device, ...props }) {
2674
+ return (jsxRuntimeExports.jsx("ul", { "data-slot": "pagination-content", className: cn('flex flex-row items-center', device === 'mobile' ? 'gap-[6px]' : 'gap-2', className), ...props }));
2675
+ }
2676
+ function PaginationItem({ ...props }) {
2677
+ return jsxRuntimeExports.jsx("li", { "data-slot": "pagination-item", ...props });
2678
+ }
2679
+ function PaginationLink({ className, device, variant, isActive, ...props }) {
2680
+ return (jsxRuntimeExports.jsx("a", { "aria-current": isActive ? 'page' : undefined, "data-slot": "pagination-link", "data-active": isActive, className: cn(buttonVariants({
2681
+ variant: variant === 'nextPrev' ? variant : isActive ? 'active' : 'outline',
2682
+ device,
2683
+ }), className), tabIndex: props['aria-disabled'] ? -1 : 0, ...props }));
2684
+ }
2685
+ function PaginationPrevious({ className, device, variant, ...props }) {
2686
+ const isMobile = device === 'mobile';
2687
+ const content = {
2688
+ mobile: jsxRuntimeExports.jsx(ChevronRight, { size: 18 }),
2689
+ desktop: (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(ChevronsRight, { size: 20 }), " ", jsxRuntimeExports.jsx("span", { children: "\u0642\u0628\u0644\u06CC" })] })),
2690
+ };
2691
+ return (jsxRuntimeExports.jsx(PaginationLink, { "aria-label": "Go to previous page", className: !isMobile
2692
+ ? 'flex justify-center items-center gap-2 w-[89px] h-[48px] ml-4'
2693
+ : 'ml-2.5', device: device, variant: "nextPrev", ...props, children: device === 'mobile' ? content.mobile : content.desktop }));
2694
+ }
2695
+ function PaginationNext({ className, device, variant, ...props }) {
2696
+ const isMobile = device === 'mobile';
2697
+ const content = {
2698
+ mobile: jsxRuntimeExports.jsx(ChevronLeft, { size: 18 }),
2699
+ desktop: (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("span", { children: "\u0628\u0639\u062F\u06CC" }), jsxRuntimeExports.jsx(ChevronsLeft, { size: 20 })] })),
2700
+ };
2701
+ return (jsxRuntimeExports.jsx(PaginationLink, { "aria-label": "Go to next page", className: !isMobile
2702
+ ? 'flex justify-center items-center gap-2 w-[89px] h-[48px] mr-4'
2703
+ : 'mr-2.5', device: device, variant: "nextPrev", ...props, children: device === 'mobile' ? content.mobile : content.desktop }));
2704
+ }
2705
+ function PaginationEllipsis({ className, ...props }) {
2706
+ return (jsxRuntimeExports.jsx("span", { "aria-hidden": true, "data-slot": "pagination-ellipsis", className: cn('flex size-9 items-center justify-center', className), ...props, children: jsxRuntimeExports.jsx(Ellipsis, { className: "size-4" }) }));
2707
+ }
2708
+ function buttonVariants({ variant, device, }) {
2709
+ const isMobile = device === 'mobile';
2710
+ const base = cn({
2711
+ 'flex items-center justify-center rounded-[6px]': true,
2712
+ 'w-[40px] h-[40px] text-s font-heavy': isMobile,
2713
+ 'w-[48px] h-[48px] text-l font-heavy': !isMobile,
2714
+ });
2715
+ const variants = {
2716
+ outline: 'border border-neutral-light bg-white text-neutral-darker',
2717
+ active: 'bg-primary text-white',
2718
+ nextPrev: 'border border-neutral-light bg-white text-neutral-darker',
2719
+ };
2720
+ return [base, variants[variant]].join(' ');
2721
+ }
2722
+ const Pagination$1 = ({ pageCount, page: controlledPage, defaultPage = 1, onPageChange, className, ...navProps }) => {
2723
+ const isControlled = controlledPage !== undefined;
2724
+ const [internalPage, setInternalPage] = useState(defaultPage);
2725
+ const page = isControlled ? controlledPage : internalPage;
2726
+ const { isMobile } = useMobile();
2727
+ const device = isMobile ? 'mobile' : 'desktop';
2728
+ useEffect(() => {
2729
+ if (!isControlled)
2730
+ setInternalPage(defaultPage);
2731
+ }, [defaultPage, isControlled]);
2732
+ const changePage = (newPage) => {
2733
+ if (!isControlled)
2734
+ setInternalPage(newPage);
2735
+ onPageChange?.(newPage);
2736
+ };
2737
+ function renderPages() {
2738
+ const items = [];
2739
+ if (pageCount <= 5) {
2740
+ for (let i = 1; i <= pageCount; i++) {
2741
+ items.push(jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationLink, { href: "#", isActive: page === i, variant: "main", device: device, onClick: (e) => {
2742
+ e.preventDefault();
2743
+ if (page !== i)
2744
+ changePage(i);
2745
+ }, "aria-disabled": page === i, tabIndex: page === i ? -1 : 0, children: i }) }, i));
2746
+ }
2747
+ }
2748
+ else {
2749
+ // First page
2750
+ items.push(jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationLink, { href: "#", isActive: page === 1, device: device, variant: "main", onClick: (e) => {
2751
+ e.preventDefault();
2752
+ if (page !== 1)
2753
+ changePage(1);
2754
+ }, "aria-disabled": page === 1, tabIndex: page === 1 ? -1 : 0, children: "1" }) }, 1));
2755
+ // Ellipsis start
2756
+ if (page > 3) {
2757
+ items.push(jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationEllipsis, {}) }, "start-ellipsis"));
2758
+ }
2759
+ // Middle pages
2760
+ const start = Math.max(2, page - 1);
2761
+ const end = Math.min(pageCount - 1, page + 1);
2762
+ for (let i = start; i <= end; i++) {
2763
+ items.push(jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationLink, { href: "#", isActive: page === i, device: device, variant: "main", onClick: (e) => {
2764
+ e.preventDefault();
2765
+ if (page !== i)
2766
+ changePage(i);
2767
+ }, "aria-disabled": page === i, tabIndex: page === i ? -1 : 0, children: i }) }, i));
2768
+ }
2769
+ // Ellipsis end
2770
+ if (page < pageCount - 2) {
2771
+ items.push(jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationEllipsis, {}) }, "end-ellipsis"));
2772
+ }
2773
+ // Last page
2774
+ items.push(jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationLink, { href: "#", isActive: page === pageCount, device: device, variant: "main", onClick: (e) => {
2775
+ e.preventDefault();
2776
+ if (page !== pageCount)
2777
+ changePage(pageCount);
2778
+ }, "aria-disabled": page === pageCount, tabIndex: page === pageCount ? -1 : 0, children: pageCount }) }, pageCount));
2779
+ }
2780
+ return items;
2781
+ }
2782
+ return (jsxRuntimeExports.jsx(PaginationRoot, { className: className, ...navProps, children: jsxRuntimeExports.jsxs(PaginationContent, { device: "mobile", children: [jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationPrevious, { href: "#", onClick: (e) => {
2783
+ e.preventDefault();
2784
+ if (page > 1)
2785
+ changePage(page - 1);
2786
+ }, variant: "nextPrev", device: device, "aria-disabled": page === 1, tabIndex: page === 1 ? -1 : 0 }) }), renderPages(), jsxRuntimeExports.jsx(PaginationItem, { children: jsxRuntimeExports.jsx(PaginationNext, { href: "#", onClick: (e) => {
2787
+ e.preventDefault();
2788
+ if (page < pageCount)
2789
+ changePage(page + 1);
2790
+ }, variant: "nextPrev", device: device, "aria-disabled": page === pageCount, tabIndex: page === pageCount ? -1 : 0 }) })] }) }));
2791
+ };
2792
+
2793
+ const Accordion$1 = React.forwardRef(({ title, body, startIcon, isExpanded: controlledExpanded, onToggle, defaultExpanded = false, className, id, disabled = false, forceMobile, ...props }, ref) => {
2794
+ const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
2795
+ const { isMobile: contextIsMobile } = useMobile();
2796
+ // Use forceMobile prop if provided, otherwise use context
2797
+ const isMobile = forceMobile !== undefined ? forceMobile : contextIsMobile;
2798
+ // Use controlled state if provided, otherwise use internal state
2799
+ const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;
2800
+ const handleToggle = () => {
2801
+ if (disabled)
2802
+ return;
2803
+ const newExpanded = !isExpanded;
2804
+ if (controlledExpanded === undefined) {
2805
+ setInternalExpanded(newExpanded);
2806
+ }
2807
+ onToggle?.(newExpanded);
2808
+ };
2809
+ const accordionId = id || `accordion-${Math.random().toString(36).substr(2, 9)}`;
2810
+ const headerId = `${accordionId}-header`;
2811
+ const contentId = `${accordionId}-content`;
2812
+ // Icon size based on device
2813
+ const iconSize = isMobile ? 20 : 24;
2814
+ // Typography variants based on device
2815
+ const titleVariant = isMobile ? 'body-s-heavy' : 'body-l-heavy';
2816
+ const bodyVariant = isMobile ? 'body-s-medium' : 'body-m-medium';
2817
+ return (jsxRuntimeExports.jsxs("div", { ref: ref, className: cn('rounded-2xl border-0 overflow-hidden', 'transition-all duration-200 ease-in-out', className), ...props, children: [jsxRuntimeExports.jsxs("button", { id: headerId, type: "button", onClick: handleToggle, disabled: disabled, "aria-expanded": isExpanded, "aria-controls": contentId, className: cn('w-full flex items-center justify-between', isMobile ? 'p-3' : 'p-4', 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2', 'disabled:opacity-50 disabled:cursor-not-allowed', 'transition-all duration-200 ease-in-out', !disabled && 'hover:bg-neutral-lighter'), children: [jsxRuntimeExports.jsx("div", { className: "flex-shrink-0 mr-4", children: isExpanded ? (jsxRuntimeExports.jsx(ChevronUp, { size: iconSize, className: "text-neutral-darker transition-transform duration-200", "aria-hidden": "true" })) : (jsxRuntimeExports.jsx(ChevronDown, { size: iconSize, className: "text-neutral-darker transition-transform duration-200", "aria-hidden": "true" })) }), jsxRuntimeExports.jsxs("div", { className: cn('flex items-center flex-1', isMobile ? 'gap-3' : 'gap-4'), children: [jsxRuntimeExports.jsx("div", { className: "flex-1 text-right", children: jsxRuntimeExports.jsx(Typography$1, { variant: titleVariant, color: "neutral-darker", children: title }) }), startIcon && (jsxRuntimeExports.jsx("div", { className: cn('flex-shrink-0 flex items-center justify-center', isMobile ? 'w-6 h-6' : 'w-8 h-8'), children: startIcon }))] })] }), jsxRuntimeExports.jsx("div", { id: contentId, role: "region", "aria-labelledby": headerId, className: cn('w-full overflow-hidden transition-all duration-300 ease-in-out', isExpanded ? 'max-h-screen opacity-100' : 'max-h-0 opacity-0'), children: jsxRuntimeExports.jsx("div", { className: cn(isMobile ? 'pb-3 mt-1' : 'pb-4 mt-1.5'), children: jsxRuntimeExports.jsx("div", { className: cn('bg-neutral-lighter rounded-lg', isMobile ? 'p-3' : 'p-4'), children: jsxRuntimeExports.jsx(Typography$1, { variant: bodyVariant, color: "neutral-dark", children: body }) }) }) })] }));
2818
+ });
2819
+ Accordion$1.displayName = 'Accordion';
2820
+
2821
+ const Divider$1 = React.forwardRef(({ width = '100%', height = 1, orientation = 'horizontal', variant = 'neutral-light', className, style, ...props }, ref) => {
2822
+ const isHorizontal = orientation === 'horizontal';
2823
+ const variantClasses = {
2824
+ 'neutral-light': 'bg-neutral-light',
2825
+ 'neutral-main': 'bg-neutral-main',
2826
+ primary: 'bg-primary',
2827
+ };
2828
+ const dividerStyle = {
2829
+ width: isHorizontal ? width : height,
2830
+ height: isHorizontal ? height : width,
2831
+ ...style,
2832
+ };
2833
+ return (jsxRuntimeExports.jsx("div", { ref: ref, className: cn('shrink-0', variantClasses[variant], className), style: dividerStyle, role: "separator", ...props }));
2834
+ });
2835
+ Divider$1.displayName = 'Divider';
2836
+
2837
+ const RadioButton = ({ selected, disabled, isMobile, }) => {
2838
+ const size = isMobile ? 'size-5' : 'size-6';
2839
+ if (selected) {
2840
+ return (jsxRuntimeExports.jsxs("div", { className: cn('relative flex items-center justify-center', size), children: [jsxRuntimeExports.jsx("div", { className: cn('absolute inset-0 rounded-full border-2', disabled
2841
+ ? 'bg-neutral-light border-neutral-light'
2842
+ : 'bg-primary border-primary') }), jsxRuntimeExports.jsx("div", { className: cn('absolute rounded-full bg-white', isMobile ? 'inset-[5px]' : 'inset-1.5') })] }));
2843
+ }
2844
+ return (jsxRuntimeExports.jsx("div", { className: cn('relative flex items-center justify-center', size), children: jsxRuntimeExports.jsx("div", { className: cn('absolute inset-0 rounded-full border', isMobile ? 'border' : 'border-[1.5px]', disabled ? 'border-neutral-light' : 'border-midnight') }) }));
2845
+ };
2846
+ const RadioOptionComponent = ({ option, selected, disabled, onClick, name, isMobile, }) => {
2847
+ const [isHovered, setIsHovered] = React.useState(false);
2848
+ const handleKeyDown = (e) => {
2849
+ if ((e.key === 'Enter' || e.key === ' ') && !disabled) {
2850
+ e.preventDefault();
2851
+ onClick();
2852
+ }
2853
+ };
2854
+ const getBackgroundColor = () => {
2855
+ if (disabled)
2856
+ return 'bg-neutral-lighter';
2857
+ if (selected)
2858
+ return 'bg-primary-lightest';
2859
+ if (isHovered)
2860
+ return 'bg-primary-lightest/20';
2861
+ return 'bg-white';
2862
+ };
2863
+ const getBorderColor = () => {
2864
+ if (selected)
2865
+ return 'border-primary';
2866
+ return 'border-transparent';
2867
+ };
2868
+ const getTextColor = () => {
2869
+ if (disabled)
2870
+ return 'text-midnight';
2871
+ if (selected)
2872
+ return 'text-primary';
2873
+ return 'text-neutral-dark';
2874
+ };
2875
+ const getShadow = () => {
2876
+ if (disabled)
2877
+ return '';
2878
+ return 'shadow-[0px_2px_4px_0px_rgba(0,0,0,0.08)]';
2879
+ };
2880
+ return (jsxRuntimeExports.jsx("div", { className: cn('relative rounded-lg border-[1.5px] cursor-pointer transition-all duration-200', getBackgroundColor(), getBorderColor(), getShadow(), disabled && 'cursor-not-allowed'), onClick: disabled ? undefined : onClick, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), onKeyDown: handleKeyDown, tabIndex: disabled ? -1 : 0, role: "radio", "aria-checked": selected, "aria-disabled": disabled, children: jsxRuntimeExports.jsx("div", { className: "flex flex-row items-center justify-end relative w-full", children: jsxRuntimeExports.jsx("div", { className: cn('box-border flex flex-row items-center justify-end relative w-full', isMobile ? 'gap-2 px-4 py-3' : 'gap-4 px-6 py-4'), children: jsxRuntimeExports.jsxs("div", { className: cn('flex flex-row items-center justify-end p-0 relative shrink-0', isMobile ? 'gap-2' : 'gap-3'), children: [jsxRuntimeExports.jsx("input", { type: "radio", name: name, value: option.id, checked: selected, disabled: disabled, onChange: onClick, className: "sr-only", "aria-label": option.label }), jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-0.5 items-end justify-start p-0 relative shrink-0", children: jsxRuntimeExports.jsx("div", { className: cn('font-sans font-bold text-nowrap text-right transition-colors duration-200', isMobile
2881
+ ? 'text-[14px] leading-[24px]'
2882
+ : 'text-[16px] leading-normal', getTextColor()), children: jsxRuntimeExports.jsx("p", { className: "whitespace-pre", dir: "auto", children: option.label }) }) }), option.icon && (jsxRuntimeExports.jsx("div", { className: cn('flex items-center justify-center shrink-0 transition-colors duration-200', isMobile ? 'size-6' : 'size-7', getTextColor()), children: option.icon })), jsxRuntimeExports.jsx("div", { className: "flex flex-col items-start justify-start p-0 relative shrink-0", children: jsxRuntimeExports.jsx(RadioButton, { selected: selected, disabled: disabled, isMobile: isMobile }) })] }) }) }) }));
2883
+ };
2884
+ const RadioGroup$1 = React.forwardRef(({ options, value, onChange, name, disabled = false, className, isMobile: isMobileProp, direction = 'vertical', ...props }, ref) => {
2885
+ const { isMobile } = useMobile(isMobileProp);
2886
+ const handleOptionClick = (optionId) => {
2887
+ if (!disabled && onChange) {
2888
+ onChange(optionId);
2889
+ }
2890
+ };
2891
+ const getContainerClasses = () => {
2892
+ if (direction === 'horizontal') {
2893
+ return cn('flex flex-row gap-2', isMobile ? 'flex-wrap' : 'flex-nowrap', className);
2894
+ }
2895
+ return cn('flex flex-col gap-2', className);
2896
+ };
2897
+ return (jsxRuntimeExports.jsx("div", { ref: ref, className: getContainerClasses(), role: "radiogroup", ...props, children: options.map((option) => (jsxRuntimeExports.jsx(RadioOptionComponent, { option: option, selected: value === option.id, disabled: disabled || option.disabled, onClick: () => handleOptionClick(option.id), name: name, isMobile: isMobile }, option.id))) }));
2898
+ });
2899
+ RadioGroup$1.displayName = 'RadioGroup';
2900
+
2901
+ const chipVariants = {
2902
+ purple: {
2903
+ background: 'bg-[var(--color-primary-lightest)]',
2904
+ text: 'text-[var(--color-primary-darkest)]',
2905
+ border: 'border-[var(--color-primary-light)]',
2906
+ },
2907
+ red: {
2908
+ background: 'bg-[var(--color-error-light)]',
2909
+ text: 'text-[var(--color-error)]',
2910
+ border: 'border-[#f0d6d6]',
2911
+ },
2912
+ green: {
2913
+ background: 'bg-[var(--color-success-light)]',
2914
+ text: 'text-[var(--color-success)]',
2915
+ border: 'border-[#d4e8dc]',
2916
+ },
2917
+ orange: {
2918
+ background: 'bg-[var(--color-warning-light)]',
2919
+ text: 'text-[var(--color-warning)]',
2920
+ border: 'border-[#f5e1d1]',
2921
+ },
2922
+ blue: {
2923
+ background: 'bg-[var(--color-info-light)]',
2924
+ text: 'text-[var(--color-info)]',
2925
+ border: 'border-[#d3e9f2]',
2926
+ },
2927
+ white: {
2928
+ background: 'bg-[var(--color-white)]',
2929
+ text: 'text-[var(--color-neutral-darker)]',
2930
+ border: 'border-[var(--color-neutral-light)]',
2931
+ },
2932
+ disabled: {
2933
+ background: 'bg-[var(--color-neutral-lighter)]',
2934
+ text: 'text-[var(--color-neutral-main)]',
2935
+ border: 'border-[var(--color-neutral-light)]',
2936
+ },
2937
+ };
2938
+ const chipSizes = {
2939
+ mobile: {
2940
+ padding: 'px-2.5 py-1',
2941
+ gap: 'gap-1',
2942
+ iconSize: 'size-4',
2943
+ fontSize: 'text-[12px]',
2944
+ lineHeight: 'leading-[1.8]',
2945
+ },
2946
+ desktop: {
2947
+ padding: 'px-3 py-1',
2948
+ gap: 'gap-1.5',
2949
+ iconSize: 'size-5',
2950
+ fontSize: 'text-[14px]',
2951
+ lineHeight: 'leading-[24px]',
2952
+ },
2953
+ };
2954
+ const Chips$1 = React.forwardRef(({ variant = 'purple', size, children = 'متن پیشفرض', disabled = false, onClick, onIconClick, className, isMobile: isMobileProp, ...props }, ref) => {
2955
+ const { isMobile } = useMobile(isMobileProp);
2956
+ const actualSize = size || (isMobile ? 'mobile' : 'desktop');
2957
+ const actualVariant = disabled ? 'disabled' : variant;
2958
+ const variantStyles = chipVariants[actualVariant];
2959
+ const sizeStyles = chipSizes[actualSize];
2960
+ const handleIconClick = (e) => {
2961
+ e.stopPropagation();
2962
+ if (onIconClick) {
2963
+ onIconClick();
2964
+ }
2965
+ };
2966
+ const handleKeyDown = (e) => {
2967
+ if ((e.key === 'Enter' || e.key === ' ') && onClick && !disabled) {
2968
+ e.preventDefault();
2969
+ onClick();
2970
+ }
2971
+ };
2972
+ const renderIcon = () => {
2973
+ const iconElement = jsxRuntimeExports.jsx(X, { className: cn(sizeStyles.iconSize) });
2974
+ if (onIconClick) {
2975
+ return (jsxRuntimeExports.jsx("button", { type: "button", onClick: handleIconClick, disabled: disabled, className: cn('flex items-center justify-center', 'hover:opacity-70 transition-opacity', disabled && 'cursor-not-allowed opacity-50'), "aria-label": "\u062D\u0630\u0641", children: iconElement }));
2976
+ }
2977
+ return iconElement;
2978
+ };
2979
+ return (jsxRuntimeExports.jsxs("div", { ref: ref, className: cn(
2980
+ // Base styles
2981
+ 'relative rounded-[50px] border border-solid inline-flex', 'flex-row items-center justify-center', 'font-sans font-bold not-italic', 'text-nowrap text-right', 'transition-all duration-200',
2982
+ // Variant styles
2983
+ variantStyles.background, variantStyles.text, variantStyles.border,
2984
+ // Size styles
2985
+ sizeStyles.padding, sizeStyles.gap, sizeStyles.fontSize, sizeStyles.lineHeight,
2986
+ // Interactive styles
2987
+ onClick && !disabled && 'cursor-pointer hover:opacity-80', disabled && 'cursor-not-allowed opacity-60', className), onClick: disabled ? undefined : onClick, onKeyDown: onClick && !disabled ? handleKeyDown : undefined, tabIndex: onClick && !disabled ? 0 : undefined, role: onClick ? 'button' : undefined, ...props, children: [jsxRuntimeExports.jsx("span", { className: "text-center", children: children }), renderIcon()] }));
2988
+ });
2989
+ Chips$1.displayName = 'Chips';
2990
+
2991
+ // Protected Components (license-wrapped)
2992
+ const Typography = withLicenseProtection(Typography$1, 'Typography');
2993
+ const Button = withLicenseProtection(Button$1, 'Button');
2994
+ const Input = withLicenseProtection(Input$1, 'Input');
2995
+ const Tabs = withLicenseProtection(Tabs$1, 'Tabs');
2996
+ const Drawer = withLicenseProtection(Drawer$1, 'Drawer');
2997
+ const Backdrop = withLicenseProtection(Backdrop$1, 'Backdrop');
2998
+ const Breadcrumb = withLicenseProtection(Breadcrumb$1, 'Breadcrumb');
2999
+ const Pagination = withLicenseProtection(Pagination$1, 'Pagination');
3000
+ const Accordion = withLicenseProtection(Accordion$1, 'Accordion');
3001
+ const Divider = withLicenseProtection(Divider$1, 'Divider');
3002
+ const RadioGroup = withLicenseProtection(RadioGroup$1, 'RadioGroup');
3003
+ const Chips = withLicenseProtection(Chips$1, 'Chips');
3004
+
3005
+ export { Accordion, Backdrop, Breadcrumb, Button, Chips, Divider, Drawer, Input, MobileProvider, Pagination, RadioGroup, Tabs, Typography, initializeAutomobiKit, useMobile };
3006
+ //# sourceMappingURL=index.esm.js.map